我看到了一个通过以下步骤生成 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 似乎为密钥提供了足够的熵,对吧?两个问题:
- 我们可以
key
直接使用 1) 进行 AES 加密吗? - 2)中的空盐有什么影响?我正在考虑可能额外的步骤 2)是为了保护被泄露的密钥(只是一个猜测)。如果是,空盐是否使目的无效?因为我们可以预先计算 HKDF 的输入密钥材料与其输出之间的联系。
HKDF 声称盐是可选的,尽管使用随机盐确实可以增强它。我很困惑什么时候需要 HKDF(尤其是没有盐)。如果我们已经有一个具有足够熵的密钥,为什么我们需要它?如果我们有一个没有足够熵的弱密钥,HKDF(没有盐)如何帮助这种情况?我想象攻击者可以预先计算出弱密钥与生成密钥之间的映射,对吧?