Hmac
這種派生多個密鑰的方案是否安全?
我需要一個加密方案來生成一個確定性的私鑰鏈,這些私鑰在外部觀察者看來是隨機的,但總是可以從單個根密鑰重建,還有:
- 私鑰及其對應的公鑰都不應該包含任何關於彼此的資訊。
- 在某些私鑰洩漏的情況下,應該不可能重建後續密鑰(當然根私鑰除外)
這是我的解決方案:
val privateKey0 = HMAC-SHA256(key: rootPrivateKey, data: "Chain") val privateKey1 = HMAC-SHA256(key: rootPrivateKey ⊕ privateKey0, data: "Chain" || SHA256(privateKey0)) val privateKey2 = HMAC-SHA256(key: rootPrivateKey ⊕ privateKey1, data: "Chain" || SHA256(privateKey1)) ...
公鑰計算為 EC secp256k1 上的曲線點乘法:
val publicKey0 = privateKey0 * G(secp256k1)
現在我不是受過訓練的密碼學家,所以我想問一下這個方案是否可行?有沒有明顯的缺陷?如果是,如何改進?
我沒有看到明顯的安全漏洞,但它似乎效率低下且不標準。
您最好始終使用根密鑰作為 HMAC 密鑰,並將 HMAC 消息/數據僅基於密鑰索引(或其他身份)而不是以前的密鑰。這樣您就可以獨立創建任何密鑰。這本質上就是HKDF在 HKDF-Expand 中所做的。
如果你想使用 HKDF-Expand,你會得到類似的東西:
val privateKey0 = HMAC-SHA256(key: rootPrivateKey, data: "key0" || 0x1) val privateKey1 = HMAC-SHA256(key: rootPrivateKey, data: "key1" || 0x1) ...
這
0x1
是值為 1 的字節。您可以跳過它,因為您使用與派生鍵長度相同的雜湊,但包含它可以讓您輕鬆定義如何移動到更大的橢圓曲線(即只需使用 HKDF 生成更長的鍵)。