正確的認證加密
我正在使用 AES-CBC,使用 HMAC-SHA512 進行身份驗證,我想知道我的思考過程和實現是否正確。
通過網路發送的消息為:HMAC(64Bytes),IV(16Bytes),Ciphertext MAC 計算如下:HMAC(sha1(secretKey),Plaintext)
- 使用 SHA-512 而不是 SHA-256 是否有重要的理由?
- 我應該區別對待密鑰還是完全生成一個完整的新密鑰對來驗證密文
我正在使用 AES-CBC,使用 HMAC-SHA512 進行身份驗證,我想知道我的思考過程和實現是否正確。
通過網路發送的消息為:HMAC(64Bytes),IV(16Bytes),Ciphertext MAC 計算如下:HMAC(sha1(secretKey),Plaintext)
不,這是不正確的。
HMAC 應該在 IV 和密文值上計算,而不是在明文上計算。如果您通過明文發送 HMAC,那麼攻擊者將能夠區分相同的明文。
如果這用於傳輸安全(如您所指),那麼您可能容易受到 CBC 模式 AES 上的填充預言攻擊。如果你想使用一個好的方案,你可以看看這個RFC草案。
如果您想將其用作應用程序級協議,您可能(也)想了解加密和 MAC的順序。如果迫在眉睫,您當然可以使用 MAC-encrypt-MAC。
如果使用 192 或 256 位密鑰,則此方案中的 SHA-1 只會減少密鑰材料的數量。
使用 SHA-512 而不是 SHA-256 是否有重要的理由?
可能不是為 MAC 生成身份驗證標籤。請注意,在 64 位機器上,SHA-512 通常比 SHA-256快,因此如果您可以節省頻寬,那麼使用 SHA-512 可能是個好主意。否則,您可以使用 SHA-512/256 - 當然,如果您的目標執行時可用。
我應該區別對待密鑰還是完全生成一個完整的新密鑰對來驗證密文
你絕對不應該把 SHA-1 混在一起。
如果您感到危險,可以使用相同的密鑰進行加密和 HMAC。這不太可能(但理論上不可能)會損害對稱密鑰。
如果你想做得很好,那麼你應該使用兩個鍵。您可以使用諸如HKDF之類的密鑰派生函式從主密鑰中計算出兩個密鑰。如果這不可用,您可以回退到用於在 TLS 中生成會話密鑰的 PRF。