密碼學雜湊函式

最後更新: 2024-02-07 23:45:50 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

密碼學雜湊函式會將任意位元組字串縮減為固定大小的摘要。通訊協定依賴的是特定的抵抗性質,而不只是雜湊這個動作本身,因為快速的無金鑰摘要既不能提供訊息驗證,也不能安全地儲存密碼。

雜湊函式 #

雜湊函式會將任意大的輸入域映射到有限的輸出域,輸出通常是固定長度的位元字串:

text
H: {0, 1}* -> {0, 1}^n

單憑這項定義無法推出任何安全性質。例如,對每個輸入都滿足 f(x) = 0 的函式也是雜湊函式。它不適合雜湊表,因為所有項目都會佔用同一個儲存桶;不過其結果是效能不佳,而不是密碼學失敗。

密碼學用途會施加更嚴格的要求。資料庫不應僅因為可能遭到揭露,就保留使用者的明文密碼。資料庫中儲存的密碼驗證值必須使離線猜測攻擊的成本高昂;單獨使用通用雜湊無法達成這個目標。同樣地,摘要可以偵測意外損毀,但能夠替換訊息的攻擊者也能夠替換其摘要。單純的雜湊既不能提供來源驗證,也不能提供針對主動攻擊者的完整性保護。

由於輸入域大於摘要域,所有固定長度雜湊都存在碰撞:不同輸入具有相同摘要。因此,密碼學所關注的是,攻擊者能否以可行的資源找到有用的碰撞,或找到對應指定摘要的輸入。

生日界限 #

生日悖論有兩種等價的表述。在隨機選取的人群中,只需23人,兩人生日相同的機率就會超過50%。反過來,如果可以一次查詢一個人的生日,只需數量出乎意料地少的查詢,就有相當大的機率找到匹配的一對。在365天模型下,考察366人後,鴿籠原理保證必然存在一對匹配者。

第二種表述對雜湊更有用。雜湊輸入不必取自有界的族群:攻擊者可以持續選擇新的輸入並評估公開函式。從具有 N 個等可能輸出值的理想雜湊中取樣 q 個輸出後,至少出現一次重複輸出的機率近似為

text
1 - exp(-q(q - 1) / (2N)).

這個近似可透過考察互補事件得到。第一個輸出不受限制;下一個輸出必須避開一個已佔用的值,再下一個必須避開兩個,以此類推。將這些機率相乘,會得到一個近似按照上述指數函式遞減的乘積。因此,要達到固定的碰撞機率,需要約 sqrt(N) 次評估。對於 N = 2^n 的 n 位元摘要,通用碰撞成本約為 2^(n/2)。

均勻輸出分布是理想模型中的假設。偏差或結構性弱點可能使碰撞更容易,而 f(x) = 0 之類的函式會立即發生碰撞。不過,生日界限仍然描述了理想固定輸出雜湊不可避免的限制;擴大輸入空間無法改善這項限制。生日攻擊就是這種通用碰撞搜尋:保留先前的摘要,直到出現重複值為止。

例如,理想的32位元雜湊在約9,300次試驗後,碰撞機率會達到約1%;在約77,000次試驗後,則會達到約50%。當碰撞抵抗性重要時,這種摘要並不充分。生日界限針對的是輸入的任意一對,而不是復原某個特定輸入。

密碼學雜湊函式的安全性質 #

密碼學雜湊函式是旨在抵抗指定攻擊的無金鑰雜湊。「密碼學雜湊函式」不是一個形式化的單一安全性遊戲;其含義取決於通訊協定所需的性質。對於雜湊 H,值 y 的原像是任何滿足 H(m) = y 的訊息 m。

以下遊戲在攻擊者接收的內容以及可以選擇的內容方面有所不同:

  1. 原像抵抗性: 給定目標摘要 y,找出任何滿足 H(m) = y 的 m。
  2. 第二原像抵抗性: 給定特定訊息 m1,找出不同的 m2,使得 H(m1) = H(m2)。
  3. 碰撞抵抗性: 找出不同的 m1、m2,使得 H(m1) = H(m2)。
  4. 選擇前綴碰撞抵抗性: 給定兩個不同的前綴 p1 和 p2,找出後綴 s1 和 s2,使得 H(p1 || s1) = H(p2 || s2)。

碰撞攻擊允許攻擊者同時選擇兩則訊息,而第二原像遊戲會固定其中一則訊息。原像遊戲則會固定摘要。這些遊戲不應被歸併為普遍的強弱順序:在特定分布和模型下,性質之間可能存在形式上的蘊含,但弱點也可能與目標有關。通訊協定必須選擇符合攻擊者可控制輸入的性質。

對於理想的 n 位元雜湊,通用原像搜尋和第二原像搜尋需要約 2^n 的工作量,而生日方法約以 2^(n/2) 的工作量找到碰撞。碰撞抵抗性表示沒有攻擊能實質降低通用生日成本,而不是表示不存在碰撞。

選擇前綴碰撞比一對互不相關的碰撞檔案更具能力。攻擊者可以從兩個具有意義且不同的前綴開始,例如兩種文件格式的標頭與初始內容,然後產生具有相同摘要的後綴。針對MD5的實際選擇前綴碰撞顯示,碰撞可以嵌入語意不同的工件中,包括偽造的憑證相關材料。這類攻擊使MD5在對碰撞敏感的用途上不可接受。

無金鑰雜湊不使用秘密金鑰。接受金鑰的建構是訊息驗證碼、某些術語中的帶金鑰雜湊,或其他原語;其安全要求必須另外評估。

雜湊設計與建構 #

有效的密碼學設計會將輸入中的微小變化廣泛分散到輸出中,這種效果稱為雪崩效應。雪崩行為是有用的診斷指標,但不能證明原像抵抗性、第二原像抵抗性或碰撞抵抗性。這些性質關注的是攻擊者可採用的最佳演算法。

許多反覆式雜湊從壓縮函式開始。壓縮函式接收一個鏈結值和一個固定大小的訊息區塊,產生相同寬度的新鏈結值:

text
C: {0, 1}^n x {0, 1}^b -> {0, 1}^n

「壓縮」是指總輸入比輸出更長;它不表示函式可逆。安全性分析會針對這個元件尋找適當的單向性與碰撞抵抗性。古典建構可以由區塊密碼建立壓縮函式,但現代標準化雜湊家族使用專用設計。

Merkle–Damgård 建構 #

Merkle–Damgård建構會將固定輸入壓縮函式轉換為可變長度雜湊。它從初始鏈結值開始,將訊息填補成多個區塊,並將每個區塊與目前的鏈結值一起輸入壓縮函式。最終鏈結值就是摘要。

Merkle–Damgård強化會在填補中附加原始訊息長度的編碼。在符合其條件的情況下,具有碰撞抵抗性的壓縮函式會產生具有碰撞抵抗性的可變長度雜湊:沒有強化時,填補後輸入可能因訊息邊界模糊而產生碰撞。MD5、SHA-1和SHA-2都使用這種廣義建構;它們的實際安全性取決於各自的壓縮函式和摘要長度。

長度編碼並不會防止相關的長度延伸性質。對於傳統的Merkle–Damgård雜湊,m 的摘要會暴露處理 m 及其填補後的鏈結值。知道摘要和 m 的長度後,攻擊者通常可以在不知道 m 的情況下,計算 m || padding(m) || extension 的有效摘要。當系統以下列方式驗證資料時,這項結果相當重要:

text
SHA-256(secret || message)

如果可以猜測秘密值的長度,攻擊者就能延伸 message 並計算相應的摘要。不要將單純的Merkle–Damgård雜湊用作秘密前綴MAC。請改用HMAC:

text
HMAC(K, m) = H((K XOR opad) || H((K XOR ipad) || m))

HMAC的巢狀帶金鑰建構可抵抗長度延伸;搭配SHA-256等目前的雜湊使用時,適合進行訊息驗證。不過,通訊協定仍必須定義金鑰產生、截短、訊息編碼和金鑰分離。

網域分離與加鹽 #

一個雜湊函式經常在通訊協定中扮演多個角色。網域分離可防止某個角色中的值被另一個角色接受。標準化建構可以在前面加上固定的函式識別碼、將內容文字串置於專用欄位,或為每個角色衍生獨立金鑰。編碼必須明確:在沒有長度資訊或指定序列化方式的情況下串接可變長度值,可能會將不同的欄位序列映射到相同的位元組字串。

請使用通訊協定或原語定義的網域分離機制。變更前綴或自行設計編碼會改變通訊協定,因此需要另外分析。SHA-3函式、可自訂的cSHAKE函式和金鑰衍生通訊協定提供不同的分離機制,因此它們的輸入不可互換。

鹽解決的是另一個問題。密碼驗證值會為每個憑證使用唯一的隨機鹽,使相同密碼不會產生相同的儲存值,並使攻擊者無法將一個預先計算的表格攤銷到多個帳戶。鹽會與驗證值一同儲存,並不是秘密。鹽不會增加密碼熵、不會驗證訊息,也不能取代網域分離。

密碼雜湊還必須施加可設定的時間成本和記憶體成本。在可用時,請依照RFC 9106使用Argon2id;平台和合規性限制可能要求使用scrypt、bcrypt或PBKDF2。請儲存演算法識別碼、參數、鹽和衍生輸出,以便在成功登入後升級參數。

選擇雜湊演算法 #

請根據適用標準、互通性需求和通訊協定,使用SHA-256、SHA-512/256、SHA-3或BLAKE2等現代通用雜湊。SHA-256提供256位元摘要,理想的一般碰撞工作因子為128位元。SHA-512/256是基於SHA-512的獨立演算法,輸出為256位元;它不是將SHA-512非正式截短而成。

MD5的碰撞抵抗性已被破解,不得在碰撞敏感的安全應用程式中選用。SHA-1存在實際碰撞攻擊和選擇前綴碰撞攻擊,同樣不應再用於數位簽章、憑證及類似用途。舊版驗證可能需要辨識這些演算法,但新設計不得建立MD5或SHA-1簽章。遷移需要明確的演算法識別碼、對新產生資料的允許清單、移除舊版驗證的期限,以及防止降級至過時演算法的保護措施。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)