微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用HKDF的目的是什么?

如何解决使用HKDF的目的是什么?

我看到了一个通过以下步骤生成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)是保护密钥泄漏(只是一个猜测)。如果是,零盐会否使目的无效?因为我们可以预先计算HKDF的输入密钥材料与其输出间的联系。

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

解决方法

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

是的,可以。但是,出于某些原因,您想经常更改密钥,例如算法/方案限制,不要泄漏(主)密钥,扩展密钥材料,导出多个密钥和/或IV值等。等等。首先需要KBKDF的任何内容(HKDF是一个哈希基于密钥的密钥派生函数。

但是,如果只有一个128位密钥是从另一个128位密钥派生的,那么我看不出太多好处。唯一有用的是,如果您不信任SecureRandom实现的安全性,因为当攻击者尝试猜测(显然是)状态时,KDF放下了另一层HMAC来突破弱)随机数生成器。

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

  1. 2)中的零盐有什么影响?我正在考虑可能需要执行的额外步骤2)是保护密钥泄漏(只是一个猜测)。如果是,零盐会否使目的无效?因为我们可以预先计算HKDF的输入密钥材料与其输出之间的联系。

否,无论是否存在盐,密钥导出功能都是单向的。该盐用于HKDF的安全证明。但是,实际上并不需要提供足够的安全性。 如果您可以添加/存储/传输盐,那么这样做会提高安全性,但是有很多KBKDF首先不允许(明确地)添加盐。另一方面:基于密码的KDF(例如PBKDF2)确实需要安全保护。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。