【发布时间】:2021-01-31 10:26:21
【问题描述】:
我看到了一个代码 sn-p,它通过以下步骤生成 AES 密钥:
-
生成一个 16 字节的随机值数组。
SecureRandom random = new SecureRandom(); byte[] key = new byte[16]; random.nextBytes(key); -
将 HKDF 应用于密钥以生成新的加密密钥。
encrypt_key = KeyDerivation.hkdfSha256(Key,
/* inputSalt =*/ null,
hkdfInfoString.getBytes("UTF-8"),
16);
我很困惑为什么我们需要两个步骤。 SecureRandom 似乎为密钥提供了足够的熵,对吧? 两个问题:
- 我们可以直接使用 1) 中的
key进行 AES 加密吗? - 2) 中的空盐有什么影响?我正在考虑可能额外的步骤 2)是为了保护被泄露的密钥(只是一个猜测)。如果是,空盐是否使目的无效?因为我们可以预先计算出 HKDF 的输入密钥材料与其输出之间的联系。
HKDF 声称盐是可选的,尽管使用随机盐确实可以增强它。我很困惑什么时候需要 HKDF(尤其是没有盐)。如果我们已经有一个具有足够熵的密钥,为什么我们需要它?如果我们有一个没有足够熵的弱密钥,HKDF(没有盐)如何帮助这种情况?我在想象攻击者可以预先计算出弱密钥到生成密钥之间的映射,对吧?
【问题讨论】:
-
是的,16 字节的 SecureRandom 应该包含几乎 128 位的熵,因此您不一定需要 HKDF 来生成单个 128 位 AES 密钥。但是,如果您想从单个全熵 128 位种子生成两个这样的密钥怎么办?如果想同时生成 AES 密钥和 MAC 密钥怎么办?如果您的密钥材料来源是具有 255 位熵的 ECDH 密钥协议怎么办?安全工程方面,将熵的获取与秘密的生成分开具有显着优势。 HKDF 提供了允许这样做的安全属性。
标签: cryptography kdf hkdf