我在.NET工作,据我所知,密钥派生的唯一选择是PBKDF2-HMAC-SHA1 1。SHA1 1‘S的输出大小只有160位。但我正在实现认证加密,因此需要512位的密钥材料(256位AES密钥和256位HMAC密钥)。我的原意是将密码、salt和高numberOfIterations输入到PBKDF2中,以导出AES密钥和HMAC密钥。
有几个人指出,我让攻击者的工作变得更容易了。从PBKDF2-HMAC-SHA1 1中获取512位关键材料需要ceil(512/160) =4个调用* numberOfIterations。但是,攻击者只需要AES密钥就可以解密消息,所以他/她只需要执行ceil(256/160) =2个调用* numberOfIterations。
我读过两条关于如何解决这个问题的建议:
我在这个职位和这个职位等其他堆栈交换帖子中看到,通过执行以下操作,可以从主键(MK)派生出两个密钥:
这些步骤会不会为AES-加密-然后HMAC-认证生成一对合适的密钥?
发布于 2016-04-20 07:04:29
这些步骤会不会为AES-加密-然后HMAC-认证生成一对合适的密钥?
是。那就好了。它几乎是香港发展基金--实际上是扩张。
但是,正如您注意到的,通过从160位密钥中派生出两个256位密钥,您的有效安全性将“仅为”160位,因为攻击者可以强行使用中间密钥。这根本不是一个现实的问题,但如果你有严格的要求,例如,一些法规,你会想要解决这个问题。
一种方法是使用PBKDF2派生320位(需要两次传递它的迭代),然后从它派生出两个256位键。
使用注释中提到的512位PBKDF2输出的每一个其他字节的想法也是可行的,但是在密钥分离方面有一个轻微的弱点。如果其中一个最终密钥-- AES或MAC密钥(或两者中的一个字节)泄漏,攻击者只需计算每个密码的一个PBKDF2调用,就可以在短于预期的时间内查找另一个密钥。
再说一遍,这可能不是一个真正的问题,因为你会想要保持这两个密钥的秘密,这只是一个因素的四个攻击时间。不过,它确实有点混乱,而使用HMAC/HKDF作为密钥派生是一个简单的解决方案。
https://crypto.stackexchange.com/questions/34700
复制相似问题