- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優點與缺點
- 密碼學 - 現代
- 密碼學 - 傳統密碼
- 密碼學 - 加密需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 組成部分
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力攻擊
- 密碼系統 - 密碼分析技術
- 密碼學型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel分組密碼
- 分組密碼的工作模式
- 分組密碼的工作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密文反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 經典密碼
- 密碼學 - 反向密碼
- 密碼學 - 凱撒密碼
- 密碼學 - ROT13演算法
- 密碼學 - 置換密碼
- 密碼學 - 加密置換密碼
- 密碼學 - 解密置換密碼
- 密碼學 - 乘法密碼
- 密碼學 - 仿射密碼
- 密碼學 - 簡單替換密碼
- 密碼學 - 簡單替換密碼加密
- 密碼學 - 簡單替換密碼解密
- 密碼學 - 維吉尼亞密碼
- 密碼學 - 維吉尼亞密碼實現
- 現代密碼
- Base64編碼與解碼
- 密碼學 - XOR加密
- 替換技術
- 密碼學 - 單字母替換密碼
- 密碼學 - 單字母替換密碼破解
- 密碼學 - 多字母替換密碼
- 密碼學 - Playfair密碼
- 密碼學 - Hill密碼
- 多字母替換密碼
- 密碼學 - 一次性密碼本密碼
- 一次性密碼本密碼的實現
- 密碼學 - 置換技術
- 密碼學 - 柵欄密碼
- 密碼學 - 列置換密碼
- 密碼學 -隱寫術
- 對稱演算法
- 密碼學 - 資料加密
- 密碼學 - 加密演算法
- 密碼學 - 資料加密標準
- 密碼學 - 三重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 vs SHA1
- 密碼學 - RSA vs DSA
- 密碼學 - RSA vs Diffie-Hellman
- 密碼學 vs 密碼學
- 密碼學 - 密碼學 vs 密碼分析
- 密碼學 - 經典 vs 量子
- 密碼學 vs 隱寫術
- 密碼學 vs 加密
- 密碼學 vs 網路安全
- 密碼學 - 流密碼 vs 分組密碼
- 密碼學 - AES vs DES 密碼
- 密碼學 - 對稱 vs 非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
SHA-1(安全雜湊演算法1)
SHA-1是一種密碼雜湊函式,它可以從任何長度不超過264 - 1位的輸入訊息生成一個160位的雜湊值(也稱為訊息摘要)。
SHA-1是由國家安全域性(NSA)設計的,並於1995年由國家標準與技術研究院(NIST)作為安全雜湊標準(SHS)的一部分發布。
SHA-1是單向函式,這意味著無法從其雜湊值計算出原始訊息。
在上圖中,在SHA-1壓縮函式的一個迴圈中,A、B、C、D和E代表32位狀態字。
- F = 變化的非線性函式。
- ⋘n = 左移n位。
- n = 每個操作的值都不同。
- Wt = 第t輪的擴充套件訊息字;
- Kt = 第t輪的輪常數;以及
- ⊞ = 模232加法。
演算法
以下是SHA-1中需要遵循的步驟:
- 初始化
- 讓我們從一些初始值開始。
- 用正確的值設定所有五個變數(h0到h4)。
- 預處理
- 準備要進行雜湊處理的訊息。
- 應在訊息的末尾新增一個'1'位。
- 為了設定訊息的最大長度,請追加一些'0'位。
- 在訊息的末尾,包含訊息的原始長度(以位為單位)。
- 處理
- 將訊息分成易於管理的部分,並分別處理每一部分。
- 每一部分應包含512位。
- 將這些部分分別分成十六個32位字。
- 使用公式將這些字擴充套件成八十個32位字。
- 主迴圈
- 遍歷每個字並進行一些計算。
- 根據字的位置和值,更新臨時變數。
- 根據這些計算,更新雜湊值。
- 最終化
- 要獲得最終雜湊值,請組合雜湊值。
- 使用預定的順序排列雜湊值以生成一個160位整數。
SHA-1的實現
以下是SHA-1演算法的Python和Java實現,以及結果:
使用Python
此Python程式碼透過使用hashlib包實現SHA-1演算法。它定義了函式sha1,該函式接受訊息作為輸入並輸出使用SHA-1生成的雜湊值。在函式內部,生成一個SHA-1雜湊物件並使用輸入訊息對其進行更新,並返回雜湊的十六進位制摘要。
import hashlib
def sha1(message):
# generate a SHA-1 hash object
sha1_hash = hashlib.sha1()
# update the hash object
sha1_hash.update(message.encode('utf-8'))
# hexadecimal digest of the hash
return sha1_hash.hexdigest()
# execute the function
message = "Hello, everyone!"
sha1_hash = sha1(message)
print("SHA-1 hash:", sha1_hash)
輸出
SHA-1 hash: 9a8bfaaace7b9e422f79ef862956e3512aa9d8ea
使用Java
在此Java程式碼中,我們將使用java.security.MessageDigest類。該類實現了SHA-1演算法。它定義了一個名為sha1的方法,該方法接受訊息作為輸入並返回其SHA-1雜湊值。該函式為SHA-1建立一個MessageDigest物件,用訊息位元組更新它,獲取摘要位元組。因此,請參考下面的Java程式碼以獲取SHA-1:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA1 {
public static String sha1(String message) {
try {
// generate a MessageDigest object here
MessageDigest md = MessageDigest.getInstance("SHA-1");
// then update the digest
md.update(message.getBytes());
// the digest bytes
byte[] digestBytes = md.digest();
// change the bytes to hexadecimal
StringBuilder sb = new StringBuilder();
for (byte b : digestBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
// execute the function
String message = "Hello, tutorialspoint!";
String sha1Hash = sha1(message);
System.out.println("SHA-1 hash: " + sha1Hash);
}
}
輸出
SHA-1 hash: 92c2164b880f6a60355a0764dd59ae828b53d6f3
SHA-1的特性
SHA-1具有幾個特性,使其適合各種應用:
- 雜湊函式的基本目的是為每個輸入訊息生成不同的雜湊值。SHA-1確保兩個不同的訊息不太可能生成相同的雜湊結果,從而使其能夠抵抗碰撞攻擊。
- SHA-1是單向函式,這意味著無法從其雜湊值檢索原始訊息。此屬性對於數字簽名、密碼儲存和其他安全相關應用至關重要。
- SHA-1具有固定的160位輸出長度,無論輸入訊息的大小如何。這允許您輕鬆比較雜湊值並將它們儲存在資料庫中。
SHA-1的應用
SHA-1用於各種應用,例如:
- 數字簽名 - 數字簽名演算法(如數字簽名標準 (DSS))使用SHA-1來確保資料完整性和不可否認性。
- 密碼儲存 - 密碼使用SHA-1儲存在資料庫中。系統儲存密碼的雜湊值而不是實際密碼,這使得攻擊者難以竊取密碼。
- 安全通訊 - SHA-1在安全通訊協議(如傳輸層安全 (TLS) 和安全套接字層 (SSL))中保護資料完整性和機密性。
SHA-1的漏洞
雖然 SHA-1 之前被認為是一種安全的雜湊演算法,但目前它容易受到各種攻擊。
SHA-1 的根本風險在於其抗碰撞性,這意味著兩個不同的訊息可以生成相同的雜湊值。這可以用於多種方式,例如:
- 生日攻擊 − 生日攻擊是一種碰撞攻擊,攻擊者試圖找到兩個具有相同雜湊值的獨立訊息。使用 SHA-1 的生日攻擊只需要 280 次計算,對於現代計算能力來說是可行的。
- 中間人攻擊 − 中間人攻擊發生在攻擊者攔截並修改雙方之間傳送的資料時。SHA-1 允許攻擊者生成一個與原始訊息具有相同雜湊值的修改後的訊息,這使得難以檢測到更改。
- 證書偽造 − 數字證書使用 SHA-1 來驗證網站或服務的真實性。但是,由於容易受到碰撞攻擊,攻擊者可以生成一個與真實證書具有相同雜湊值的偽造證書。
SHA-1 的替代方案
- 由於 SHA-1 的弱點,建議採用更強大的雜湊演算法,例如 SHA-2 和 SHA-3。
- SHA-2 是一組雜湊演算法,其中包含 SHA-256、SHA-384 和 SHA-512,它們分別生成 256、384 和 512 位的雜湊值。
- SHA-2 是為了取代 SHA-1 而建立的,被認為更加安全。SHA-3 是 NIST 於 2012 年開發的一種較新的雜湊函式,其建立雜湊值的方式與 SHA-2 不同。
最佳實踐
由於 SHA-1 容易受到攻擊,一些舊程式和系統仍在使用它。為了最大限度地降低此類情況下的攻擊風險,務必遵循最佳實踐:
- 避免將 SHA-1 應用於新的應用程式和平臺 − 選擇更強大的雜湊演算法,例如 SHA-2 和 SHA-3。
- 升級舊系統 − 如果你在舊系統中繼續使用 SHA-1,建議儘快切換到更好的雜湊演算法。
- 使用加鹽雜湊 − 為了提高密碼儲存安全性,加鹽雜湊在雜湊後向密碼新增隨機文字(鹽)。這使得攻擊者使用預計算雜湊表破解密碼變得更加困難。
廣告