使用香港发展基金的目的是什么



我看到一个代码片段,它通过以下步骤生成AES密钥:

  1. 生成一个16字节的随机值数组。

    SecureRandom random = new SecureRandom();
    byte[] key = new byte[16];
    random.nextBytes(key); 
    
  2. 将HKDF应用于密钥以生成新的加密密钥。

encrypt_key = KeyDerivation.hkdfSha256(Key,
/* inputSalt =*/ null,
hkdfInfoString.getBytes("UTF-8"),
16);

我很困惑为什么我们需要两个步骤。SecureRandom似乎为密钥提供了足够的熵,对吧?两个问题:

  1. 我们可以直接使用1(中的key进行AES加密吗
  2. 2(中的空盐有什么影响?我正在考虑可能还有一个额外的步骤2(来保护密钥被泄露(只是猜测(。如果是,无效的salt会使目的无效吗?因为我们可以预先计算HKDF的输入关键材料与其输出之间的联系

HKDF声称盐是可选的,尽管使用随机盐确实会增强它。我很困惑什么时候需要HKDF(尤其是没有盐(。如果我们已经有了一个熵足够大的密钥,为什么我们需要它?如果我们有一个没有足够熵的弱密钥,HKDF(无盐(如何帮助这种情况?我在想象攻击者可以预先计算弱密钥到生成密钥之间的映射,对吧?

  1. 我们可以直接使用1(中的密钥进行AES加密吗

是的,你可以。然而,您想要经常更改密钥是有原因的,例如算法/方案限制、不泄露(主(密钥、扩展密钥材料、派生多个密钥和/或IV值等……好吧,任何您首先需要KBKDF的东西(HKDF是一种基于哈希的基于密钥的密钥派生函数(。

然而,如果只有一个128位密钥是从另一个128比特密钥派生而来的,那么我看不出有多大好处。这可能唯一有用的地方是,如果你不信任SecureRandom实现的安全性,因为当攻击者试图猜测(明显较弱的(随机数生成器的状态时,KDF会设置另一层HMAC来突破。

当然,正如您在问题中所指出的,攻击者仍然可以猜测随机生成器的状态,但至少攻击者无法通过反转计算或获取有关状态的统计信息来获得有关状态的信息。

  1. 2中的空盐有什么影响?我正在考虑可能还有一个额外的步骤2(来保护密钥被泄露(只是猜测(。如果是,无效的salt会使目的无效吗?因为我们可以预先计算HKDF的输入关键材料与其输出之间的联系

否,无论是否存在盐,密钥派生函数都是单向的。该盐用于香港发展基金的安全证明。然而,实际上并不需要提供足够的安全性如果您可以添加/存储/传输盐,那么这将有利于安全性,但有很多KBKDF一开始就不(明确(允许使用盐。另一方面:像PBKDF2这样基于密码的KDF确实需要一个salt来确保安全。

最新更新