Sha-256
我應該使用 SHA256 還是 Blake2 來校驗和並簽署 scrypt 標頭?
我使用 scrypt 作為密鑰派生函式(不儲存密碼)。為了傳遞分離的密鑰頭,我使用在 Colin Percival 的 scrypt 實現 ( scryptenc.c#L224 ) 中實現的標準編碼。
原始 scrypt 密鑰頭編碼
- binary 將算法標識符 (“scrypt\0”)、logN、r、p 和 salt 編碼為 48 字節的標頭
- 使用 SHA-256 對這些字節進行校驗和,並將校驗和的前 16 個字節附加到標頭
- 使用 HMAC SHA-256 對連接的工作因子和校驗和進行簽名,將簽名附加到標頭
生成的 96 個字節構成密鑰頭。
我的要求
- 我很少需要派生密鑰,可能每天十幾次。
- 密鑰源自人工生成的密碼
- 我的應用程序可以在 32 位系統(例如智能手機)和 64 位台式機上執行。
- 我的項目在支持 SHA-256 和 Blake2 的 Go 中
- Blake2s 和 Blake2b 的 Go 實現不提供 128 位校驗和
使用 Blake2 進行校驗和簽名而不是 SHA-256 對我來說會有什麼不同嗎?安全性有區別嗎?
如果我使用 Blake2-256,我會切斷 16 個字節的校驗和(這似乎不推薦),使用 32 個字節還是保持原樣使用 SHA-256?
謝謝!
請注意,Blake2 的安全目標是SHA-256的超集:
- SHA-256 被推測為抗碰撞、抗原像和抗二次原像。
- Blake2 被推測為隨機預言不可微分,這是 SHA-256 所沒有的更強的屬性,並且暗示了三個經典的雜湊函式屬性。
所以是的,如果 Blake2 是安全的,這種替換應該是安全的。需要注意的一點是,對於這一步:
- 使用 HMAC SHA-256 對連接的工作因子和校驗和進行簽名,將簽名附加到標頭
…您不想使用 HMAC,因為 Blake2 具有內置的可選鍵控模式,其 MAC/PRF 目標與 HMAC 相同。(HMAC-Blake2 並非不安全——它只是不是將 Blake2 用作 MAC 的規範方式。)
如果我使用 Blake2-256,我會切斷 16 個字節的校驗和(這似乎不推薦),使用 32 個字節還是保持原樣使用 SHA-256?
您連結的答案並不是說截斷 Blake2 總是不安全的。它的要點是:
- 通常,堅持走人跡罕至的道路比即興創作自己的道路更明智、更安全;如果有一種易於理解的標準方法來實現 X,那麼這通常應該是您的預設選擇。(請注意,這意味著您應該為您描述的應用程序堅持 SHA-256!)
- 當散列到自定義輸出大小時,有時更安全的是使散列輸出取決於所需的輸出大小,以關閉有人能夠欺騙系統在不同上下文中散列相同輸入但截斷為不同長度的攻擊。(更一般地說,截斷散列函式是否安全取決於它的使用方式。)
在您的情況下,我會回到您正在採用已經設計好的協議並將其使用 SHA-256 替換為 Blake2 的事實。這意味著如果協議是安全的,那麼您的替換也應該是安全的,因為如果 Blake2 是安全的,那麼它應該具有協議期望從 SHA-256 獲得的所有屬性。因此,如果原始協議截斷了 SHA-256 的輸出,那麼截斷 Blake2 的輸出應該不會更糟。