SHA-256(安全雜湊演算法256位)



SHA 256 是 SHA 2 演算法家族的一部分,其中 SHA 代表安全雜湊演算法。它於 2001 年釋出,是 NSA 和 NIST 共同努力的結果,旨在推出 SHA 1 家族的繼任者,後者正逐漸失去抵禦暴力破解攻擊的能力。

名稱中的 256 表示最終雜湊摘要值,即無論明文/純文字的大小如何,雜湊值始終為 256 位。

SHA-256 的特性

SHA 演算法具有幾個重要特性,例如 -

  • 訊息長度 - 明文應小於 264 位。大小必須在相同範圍內,以保持摘要儘可能隨機。
  • 摘要長度 - SHA 256 方法的雜湊摘要應為 256 位,SHA-512 的摘要應為 512 位,依此類推。較高的摘要通常表示需要進行更多計算,但會影響速度和空間。
  • 不可逆 - 根據設計,所有雜湊函式(如 SHA 256)都是不可逆的。如果您已經擁有摘要,則不應獲得明文,並且如果您再次將摘要放入雜湊函式中,則摘要也不應返回其原始值。

現在您已經很好地瞭解了 SHA 的技術要求,您可以繼續下一部分,瞭解整個方法。

演算法

您可以將整個過程分為五個不同的部分,如下所示 -

填充位

它向訊息新增一些額外的位,以便長度正好比 512 的倍數少 64 位。此外,第一位必須為 1,其餘位應為 0。

Padding Bits

填充長度

現在,我們可以向最終明文新增 64 位資料,使其成為 512 的倍數。要確定這 64 位字元,請對未填充的初始明文應用模數運算。

Padding Length

初始化緩衝區

如下設定將在回合中使用的八個緩衝區的預設設定 -

Initialising the Buffers

我們需要在陣列中保留 64 個不同的金鑰,範圍從 K[0] 到 K[63]。

壓縮函式

整個訊息被分成許多 512 位的塊。它將每個塊執行 64 輪運算,其中每一輪的輸出都用作下一塊的輸入。

由於所有這些迭代中 K[i] 的值都是預先初始化的,因此 W[i] 是另一個輸入,根據當時執行的迭代次數,為每個塊單獨計算。

輸出

每次迭代,塊的最終輸出都成為下一個塊的輸入。整個迴圈持續進行,直到我們到達最後一個 512 位塊,此時輸出被視為最終雜湊摘要。顧名思義,此摘要的長度將為 256 位。

SHA-256 的實現

現在,我們將使用多種程式語言實現 SHA-256,以獲得實踐經驗。

使用 Python 實現 SHA-256

我們將首先匯入 hashlib 庫,如果您尚未安裝,請使用 pip 安裝。之後,我們將建立一個要雜湊的字串。然後,我們將使用 UTF-8 編碼將字串編碼為位元組,因為 hashlib 使用位元組。我們將使用 hashlib.sha256() 生成新的 SHA-256 雜湊物件。然後,我們將使用 update() 方法使用字串的位元組更新雜湊物件。最後,我們將藉助 hexdigest() 方法獲取雜湊的十六進位制表示形式並列印它。

import hashlib

# generate a string to hash
my_string = "Hello, Tutorialspoint!"

# chaneg the string to bytes 
my_bytes = my_string.encode('utf-8')

# generate a new SHA-256 hash object
hash_object = hashlib.sha256()

# Update the hash object
hash_object.update(my_bytes)

# get the hexadecimal representation
hash_hex = hash_object.hexdigest()

# print the SHA-256 hash
print("SHA-256 hash of", my_string, ":", hash_hex)

輸出

SHA-256 hash of Hello, Tutorialspoint! : caba24f8a70cc24277bffcc27aa952723fbf369f315b9657eebf7c7e42b7a1f9

使用 Java 實現 SHA-256

在此使用 Java 實現 SHA-256 的示例中,我們將定義一個名為 SHA256Class 的類,以生成給定輸入字串的雜湊值。它使用 java.security 包中的 MessageDigest 類和 BigInteger 類將位元組陣列轉換為十六進位制字串。因此,使用 Java 實現 SHA-256 的完整程式碼如下 -

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256Class {
   public static byte[] calculateSHA256(String input) throws NoSuchAlgorithmException {
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      return md.digest(input.getBytes(StandardCharsets.UTF_8));
   }

   public static String bytesToHexString(byte[] hash) {
      BigInteger number = new BigInteger(1, hash);
      StringBuilder hexString = new StringBuilder(number.toString(16));
      while (hexString.length() < 64) {
         hexString.insert(0, '0');
      }
      return hexString.toString();
   }

   public static void main(String args[]) {
      try {

         String message1 = "Simple SHA-256 Example";
         System.out.println("\n" + message1 + " : " + bytesToHexString(calculateSHA256(message1)));

         String message2 = "Secure Hash Algorithm";
         System.out.println("\n" + message2 + " : " + bytesToHexString(calculateSHA256(message2)));

         String message3 = "Hello, Tutorialspoint!";
         System.out.println("\n" + message3 + " : " + bytesToHexString(calculateSHA256(message3)));
      } catch (NoSuchAlgorithmException e) {
         System.out.println("Exception thrown for incorrect algorithm: " + e);
      }
   }
}

輸出

Simple SHA-256 Example : 0e3c2ff641548fd5b1dd2724262cc099d56459ebec2c1bb3c7f71513f65ccb39

Secure Hash Algorithm : 42cf1ce9880d7f211c3d30d3bd376d20b26aaf6a929471108025c8e99b751c89

Hello, Tutorialspoint! : caba24f8a70cc24277bffcc27aa952723fbf369f315b9657eebf7c7e42b7a1f9

SHA-256 的安全性如何?

SHA-256 是目前最強大的雜湊演算法之一。美國政府建議其機構使用 SHA-256 來保護某些敏感資料。雖然 SHA-256 操作的細節被保密,但我們確實知道它是使用 Merkle-Damgård 結構構建的,該結構源自單向壓縮函式,而該函式本身又是使用特定塊密碼的 Davies-Meyer 結構開發的。

SHA-256 安全的原因有三個 -

  • 首先,僅使用雜湊值來重新建立原始資料非常困難。需要進行 2256 次暴力破解嘗試才能生成第一組資料。
  • 其次,兩條訊息具有相同雜湊值的可能性非常小——這種情況稱為衝突。有 2256 個可能的雜湊值,這比已知宇宙中的原子數量還要多,因此兩個雜湊值相同的可能性極低。
  • 第三,當對原始資料進行少量更改時會發生雪崩效應,從而導致雜湊值發生很大變化,以至於很難分辨出新雜湊值是從類似的材料中獲得的。

SHA-256 的應用

SHA-256 是 SSL 握手、數字簽名驗證、保護密碼以及其他各種與安全相關的任務的行業標準雜湊演算法。

數字簽名的驗證

數字簽名是一種電子簽名,用於驗證通訊(例如電子郵件、信用卡交易或數字文件)的真實性和一致性。它是透過對檔案進行雜湊並使用公鑰基礎設施 (PKI) 進行加密生成的。

在整個過程中,SHA-256 雜湊方法保護了數字簽名的完整性。接收方的網路瀏覽器在其端驗證雜湊演算法,並使用公鑰解密訊息。如果它們匹配,則資料是真實且未被更改的。

SSL 握手

SSL 握手是 Web 瀏覽會話的關鍵組成部分,它依賴於 SHA-256 的功能和相容性。在任何資料傳輸開始之前,透過 SS/TLS 進行的通訊始終以 SSL 握手開始,這是一種非對稱加密,使瀏覽器能夠驗證 Web 伺服器、接收公鑰並建立安全連線。

密碼安全

使用者密碼以雜湊形式儲存在網站上。如前所述,安全的密碼雜湊使用加密方法將它們縮減為簡短的字母和/或數字字串。當網站受到攻擊時,網路罪犯無法訪問雜湊密碼。

區塊鏈交易的驗證

在比特幣最初建立時,SHA-256 雜湊演算法是第一個與加密貨幣一起使用的演算法。區塊鏈需要區塊頭才能以有序的方式連結或連線一個交易塊到下一個交易塊。SHA-256 雜湊確保在不影響新區塊頭的情況下,不會更改任何較早的區塊。

廣告