
- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優點與缺點
- 密碼學 - 現代
- 密碼學 - 傳統密碼
- 密碼學 - 加密需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 元件
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力攻擊
- 密碼系統 - 密碼分析技術
- 密碼學型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - 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 演算法
SHA 代表安全雜湊演算法。資料和證書使用 SHA(MD5 的修改版本)進行雜湊。雜湊演算法使用按位運算、模加法和壓縮函式將輸入資料壓縮成更小、更難以理解的形式。您可能會問雜湊是否可以被破解或解碼。雜湊是單向的,這意味著一旦資料被雜湊,就需要進行暴力攻擊才能破解生成的雜湊摘要。這是雜湊與加密的主要區別。
檢視下面的圖片,瞭解 SHA 演算法的工作原理。即使訊息中的單個字元發生變化,SHA 也旨在提供唯一的雜湊。

雜湊兩個相似但不同的訊息,例如“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”。我們將這種現象稱為雪崩效應。這種效應對於密碼學至關重要,因為它意味著對輸入訊息的任何修改都可能顯著改變結果。透過這樣做,將阻止攻擊者破譯雜湊摘要的原始含義,並向訊息的接收者通知在傳輸過程中所做的任何修改。