密碼學 - SHA 演算法



SHA 代表安全雜湊演算法。資料和證書使用 SHA(MD5 的修改版本)進行雜湊。雜湊演算法使用按位運算、模加法和壓縮函式將輸入資料壓縮成更小、更難以理解的形式。您可能會問雜湊是否可以被破解或解碼。雜湊是單向的,這意味著一旦資料被雜湊,就需要進行暴力攻擊才能破解生成的雜湊摘要。這是雜湊與加密的主要區別。

檢視下面的圖片,瞭解 SHA 演算法的工作原理。即使訊息中的單個字元發生變化,SHA 也旨在提供唯一的雜湊。

SHA Algorithm

雜湊兩個相似但不同的訊息,例如“Heaven”和“heaven is different”,就是一個例子。然而,唯一的區別是一個小寫字母和一個大寫字母。

SHA 還幫助識別對原始訊息所做的任何更改。使用者可以透過將雜湊摘要與原始雜湊摘要進行比較來確定是否更改了單個字母,因為它們會有很大的不同。SHA 的關鍵特性之一是其確定性。這意味著只要知道使用的雜湊演算法,任何計算機或使用者都可以重現雜湊摘要。由於 SHA 的有限性,網際網路上所有 SSL 證書都必須使用 SHA-2 方法進行雜湊。

SHA 型別

SHA 代表安全雜湊算法系列的加密雜湊函式。每種 SHA 型別都是不同的,並且有一系列數字。以下是一些常見的型別 -

  • SHA-1 - 這是 SHA 的第一個版本。由於這些弱點,目前認為它安全性較低。
  • SHA-2 - 這包括幾種具有不同摘要大小的雜湊演算法,例如 SHA-224、SHA-256、SHA-384 和 SHA-512。它們比 SHA-1 更安全,並且經常使用。
  • SHA-3 - SHA 系列的新成員,它是使用與 SHA-1 和 SHA-2 不同的方法建立的。它們包括 SHA3-224、SHA3-256、SHA3-384 和 SHA3-512。

每種 SHA 都根據輸入資料生成唯一的雜湊值(固定長度的字串)。這些雜湊值用於生成數字簽名和資料完整性驗證等其他安全相關任務。

SHA 的特性

對於密碼學,安全雜湊演算法或 SHA 由於以下幾個重要原因而有用 -

  • 資料完整性 - SHA 根據任意大小的輸入資料生成固定大小的雜湊結果(通常為 160、256、384 或 512 位)。由於輸入資料中的微小變化會導致雜湊值發生顯著變化,因此它可用於驗證資料的完整性。如果雜湊值匹配,則表明輸入資料未被更改。
  • 唯一性 - SHA 嘗試為一系列輸入生成唯一的雜湊結果。雖然在理論上仍然可能,但現代 SHA 版本(例如 SHA-256 和 SHA-3)旨在降低兩個不同的輸入生成相同雜湊值(衝突)的可能性。
  • 加密安全性 - SHA 旨在處理原像、第二原像、衝突和其他型別的加密攻擊。這意味著攻擊者將難以確定導致相同雜湊值的兩個不同輸入,或者根據其雜湊值反向工程原始輸入資料。
  • 效率 - SHA 演算法可以快速生成雜湊值,即使對於大量輸入資料也是如此,因為它們在計算上是高效的。
  • 廣泛使用 - SHA 廣泛用於許多安全應用程式中,例如區塊鏈技術、數字簽名、訊息認證碼 (MAC) 和密碼雜湊。

實現

現在我們將使用 Python、Java 和 C++ 實現 SHA 演算法 -

使用 Python 實現

首先,我們將使用 Python 的 hashlib 庫來為給定的輸入字串計算 SHA 雜湊。這裡可以根據您的需要選擇 SHA 的特定版本。使用 Python 的程式碼如下 -

示例

import hashlib

def calculate_sha(input_data):
   sha_hash = hashlib.sha256()  # Choose different versions sha1(), sha224(), sha384(), etc.
   sha_hash.update(input_data.encode('utf-8'))
   return sha_hash.hexdigest()

input_data = "Hello, Tutorialspoint!"
sha_hash = calculate_sha(input_data)
print("SHA hash:", sha_hash)

以下是上述示例的輸出 -

輸入/輸出
SHA hash: caba24f8a70cc24277bffcc27aa952723fbf369f315b9657eebf7c7e42b7a1f9

使用 Java 實現

現在我們將使用 Java 的 MessageDigest 庫來為給定的輸入字串計算 SHA 雜湊。使用 Java 的程式碼如下 -

示例

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHAExample {
   public static void main(String[] args) {
      String input = "Hello, Everyone!";
      try {
         MessageDigest shaDigest = MessageDigest.getInstance("SHA-256"); // Choose different versions like "SHA-1", "SHA-224", "SHA-384", etc.
         byte[] hashBytes = shaDigest.digest(input.getBytes());
         StringBuilder sb = new StringBuilder();
         for (byte b : hashBytes) {
            sb.append(String.format("%02x", b));
         }
         String shaHash = sb.toString();
         System.out.println("SHA hash: " + shaHash);
      } catch (NoSuchAlgorithmException e) {
         e.printStackTrace();
      }
   }
}

以下是上述示例的輸出 -

輸入/輸出
SHA hash: 06b1f0e2138fdb9f0ae8b37cb7a0c77e9e9af1293aa1bfb4d17e57a36542348c

雜湊的未來

SHA-2 現在是雜湊演算法的行業標準,但 SHA-3 可能會在將來取代它。SHA-3 於 2015 年由 NIST 釋出,NIST 也建立了 SHA-1 和 SHA-2。雖然,由於多種原因,它從未被接受為行業標準。當 SHA-3 釋出時,大多陣列織已經從 SHA-1 切換到 SHA-2,因此在 SHA-2 仍然非常安全的情況下切換到 SHA-3 毫無意義。

此外,這並不完全正確,SHA-3 被認為比 SHA-2 慢。SHA-3 每年都在進步,雖然它在軟體中速度較慢,但與 SHA-1 和 SHA-2 相比,它在硬體中速度更快。

雪崩效應

使用 SHA-1 對原始訊息'Heaven'進行雜湊的雜湊摘要為“06b73bd57b3b938786daed820cb9fa4561bf0e8e”。使用 SHA-1 對第二個'heaven'(類似的訊息)進行雜湊的雜湊摘要如下所示:“66da9f3b8d9d83f34770a14c38276a69433a535b”。我們將這種現象稱為雪崩效應。這種效應對於密碼學至關重要,因為它意味著對輸入訊息的任何修改都可能顯著改變結果。透過這樣做,將阻止攻擊者破譯雜湊摘要的原始含義,並向訊息的接收者通知在傳輸過程中所做的任何修改。

廣告