Sha-2
SHA-2 雜湊的“位獨立性”是否安全?
我知道 SHA2 函式輸出中的位獨立性很好,但它真的 100% 安全嗎?例如:
- Y = SHA512(secretKeyNonce256bit)
- A = Y 的前 32ytes / 256bits,用作消息加密密鑰
- B = 下一個 16 字節/128 位用作消息的身份驗證 HMAC 密鑰
- C = 下一個 16 字節/128 位用作訪問程式碼。非秘密,並且為消息載體所知。如果使用者提供此程式碼,則運營商會向他提供加密消息。
對 C 的了解是否會產生對 A、B 的一些見解?改用 C2=前 16 位 SHA256(C) 會更好嗎?
額外的 SHA 無法阻止的一個弱點是,如果 secretKey 是從一個糟糕的密碼中派生的
$$ not the case here $$, C 對於任何嘗試過類似粗略的密碼猜測的人來說都是有價值的,因為如果嘗試過的密碼產生 C,則密碼很可能是正確的並且可以產生正確的 A、B。有些人可能會提到 128 位 HMAC 處於較弱的一面,但我認為 128 / 64bit 的抗碰撞能力足以滿足我的應用需求。
SHA-2 的單詞(32/64 位“塊”)之間沒有已知的可利用關係,但這始終是密碼分析的來源。SHA-2 的縮減輪變體存在一些學術弱點,但對完整密碼沒有任何影響。雜湊仍然很便宜,那麼為什麼不直接使用多個雜湊函式呢?
Seed = HASH(secret) <- This should be a KDF instead see below A = HASH(Seed) B = HASH(A) C = HASH(B)
如果您需要更少的位,您可以將它們砍掉(這對 NIST 來說已經足夠了)。這是另一種選擇。
> Seed = HASH(secret) <- This should be a KDF instead see below > A = HASH(Seed XOR ConstantA) > B = HASH(Seed XOR ConstantB) > C = HASH(Seed XOR ConstantC)
保持常量與 HASH 的輸出長度相同,以避免結果有偏差。
使用 KDF
我假設“secretKeyNonce256bit”實際上是人為生成的密碼。使用簡單的未加鹽雜湊從低熵秘密中派生密鑰是一種不好的做法。您說“這裡不是這種情況”,但不清楚您的意思是它不是密碼還是“弱密碼”。如果“secretKeyNonce256bit”是來自 CSPRNG 的 64 字節隨機值,則忽略此值,但如果它是任何人為選擇的結果,您確實應該使用真正的 KDF(如 PBKDF2、Bcrypt 或 Scrypt)。