
- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優缺點
- 密碼學 - 現代
- 密碼學 - 傳統密碼
- 密碼學 - 加密需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 元件
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力破解攻擊
- 密碼系統 - 密碼分析技術
- 密碼學型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel分組密碼
- 分組密碼操作模式
- 分組密碼操作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密碼反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 經典密碼
- 密碼學 - 逆向密碼
- 密碼學 - 凱撒密碼
- 密碼學 - ROT13 演算法
- 密碼學 - 換位密碼
- 密碼學 - 加密換位密碼
- 密碼學 - 解密換位密碼
- 密碼學 - 乘法密碼
- 密碼學 - 仿射密碼
- 密碼學 - 簡單替換密碼
- 密碼學 - 簡單替換密碼加密
- 密碼學 - 簡單替換密碼解密
- 密碼學 - 維吉尼亞密碼
- 密碼學 - 實現維吉尼亞密碼
- 現代密碼
- Base64 編碼和解碼
- 密碼學 - XOR 加密
- 替換技術
- 密碼學 - 單表替換密碼
- 密碼學 - 破解單表替換密碼
- 密碼學 - 多表替換密碼
- 密碼學 - Playfair 密碼
- 密碼學 - 希爾密碼
- 多表替換密碼
- 密碼學 - 一次性密碼本密碼
- 一次性密碼本密碼的實現
- 密碼學 - 換位技術
- 密碼學 - 柵欄密碼
- 密碼學 - 列置換
- 密碼學 - 隱寫術
- 對稱演算法
- 密碼學 - 資料加密
- 密碼學 - 加密演算法
- 密碼學 - 資料加密標準
- 密碼學 - 三重DES
- 密碼學 - 雙重DES
- 高階加密標準
- 密碼學 - AES 結構
- 密碼學 - AES 變換函式
- 密碼學 - 位元組替換變換
- 密碼學 - 行移位變換
- 密碼學 - 列混合變換
- 密碼學 - 輪金鑰加變換
- 密碼學 - AES 金鑰擴充套件演算法
- 密碼學 - Blowfish 演算法
- 密碼學 - SHA 演算法
- 密碼學 - RC4 演算法
- 密碼學 - Camellia 加密演算法
- 密碼學 - ChaCha20 加密演算法
- 密碼學 - CAST5 加密演算法
- 密碼學 - SEED 加密演算法
- 密碼學 - SM4 加密演算法
- IDEA - 國際資料加密演算法
- 公鑰(非對稱)密碼學演算法
- 密碼學 - RSA 演算法
- 密碼學 - RSA 加密
- 密碼學 - RSA 解密
- 密碼學 - 建立 RSA 金鑰
- 密碼學 - 破解 RSA 密碼
- 密碼學 - ECDSA 演算法
- 密碼學 - DSA 演算法
- 密碼學 - Diffie-Hellman 演算法
- 密碼學中的資料完整性
- 密碼學中的資料完整性
- 訊息認證
- 密碼學數字簽名
- 公鑰基礎設施
- 雜湊
- MD5(訊息摘要演算法5)
- SHA-1(安全雜湊演算法1)
- SHA-256(安全雜湊演算法256位)
- SHA-512(安全雜湊演算法512位)
- SHA-3(安全雜湊演算法3)
- 雜湊密碼
- Bcrypt 雜湊模組
- 現代密碼學
- 量子密碼學
- 後量子密碼學
- 密碼學協議
- 密碼學 - SSL/TLS 協議
- 密碼學 - SSH 協議
- 密碼學 - IPsec 協議
- 密碼學 - PGP 協議
- 影像和檔案加密
- 密碼學 - 影像
- 密碼學 - 檔案
- 隱寫術 - 影像
- 檔案加密和解密
- 密碼學 - 檔案加密
- 密碼學 - 檔案解密
- 物聯網中的密碼學
- 物聯網安全挑戰、威脅和攻擊
- 物聯網安全的加密技術
- 物聯網裝置的通訊協議
- 常用加密技術
- 自定義構建加密演算法(混合加密)
- 雲加密
- 量子密碼學
- 密碼學中的影像隱寫術
- DNA 密碼學
- 密碼學中的一次性密碼 (OTP) 演算法
- 區別
- 密碼學 - MD5 與 SHA1
- 密碼學 - RSA 與 DSA
- 密碼學 - RSA 與 Diffie-Hellman
- 密碼學與密碼學
- 密碼學 - 密碼學與密碼分析
- 密碼學 - 經典與量子
- 密碼學與隱寫術
- 密碼學與加密
- 密碼學與網路安全
- 密碼學 - 流密碼與分組密碼
- 密碼學 - AES 與 DES 密碼
- 密碼學 - 對稱與非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
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。

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

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

我們需要在陣列中保留 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 雜湊確保在不影響新區塊頭的情況下,不會更改任何較早的區塊。