首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从短主密钥导出AES密钥和HMAC密钥

从短主密钥导出AES密钥和HMAC密钥
EN

Cryptography用户
提问于 2016-04-20 02:30:23
回答 1查看 1.6K关注 0票数 3

我在.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。

我读过两条关于如何解决这个问题的建议:

  1. 使用PBKDF2-HMAC-SHA512 512。它将为两个键提供足够的输出。不幸的是,.NET似乎不支持这一点。
  2. 使用带有密码、salt和高numberOfIterations的PBKDF2-HMAC-SHA1 1输出160位主密钥.然后使用HKDF-展开将主键扩展为两个256位键.不幸的是,据我所知,.NET并没有提供香港发展基金。

我在这个职位这个职位等其他堆栈交换帖子中看到,通过执行以下操作,可以从主键(MK)派生出两个密钥:

  1. 使用用户提供的密码、160位盐和高numberOfIterations,通过PBKDF2-HMAC-SHA1 1创建160位MK .
  2. 计算HMAC-SHA256 256(MK,"e") -> aesKey
  3. 计算HMAC-SHA256 256(MK,"a") -> hmacKey

这些步骤会不会为AES-加密-然后HMAC-认证生成一对合适的密钥?

  • 注1:我意识到,256位aesKey和256位hmacKey各只有160位熵,但这似乎并不重要,因为可能的攻击路径将在密码上,而不是密钥上。
  • 注2:尽管.NET确实提供HMAC-SHA1 256、HMAC-SHA1 512等,但除了PBKDF2-HMAC-SHA1之外,它没有为PBKDF2-HMAC提供其他选择。
EN

回答 1

Cryptography用户

回答已采纳

发布于 2016-04-20 07:04:29

这些步骤会不会为AES-加密-然后HMAC-认证生成一对合适的密钥?

是。那就好了。它几乎是香港发展基金--实际上是扩张。

但是,正如您注意到的,通过从160位密钥中派生出两个256位密钥,您的有效安全性将“仅为”160位,因为攻击者可以强行使用中间密钥。这根本不是一个现实的问题,但如果你有严格的要求,例如,一些法规,你会想要解决这个问题。

一种方法是使用PBKDF2派生320位(需要两次传递它的迭代),然后从它派生出两个256位键。

使用注释中提到的512位PBKDF2输出的每一个其他字节的想法也是可行的,但是在密钥分离方面有一个轻微的弱点。如果其中一个最终密钥-- AES或MAC密钥(或两者中的一个字节)泄漏,攻击者只需计算每个密码的一个PBKDF2调用,就可以在短于预期的时间内查找另一个密钥。

再说一遍,这可能不是一个真正的问题,因为你会想要保持这两个密钥的秘密,这只是一个因素的四个攻击时间。不过,它确实有点混乱,而使用HMAC/HKDF作为密钥派生是一个简单的解决方案。

票数 2
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/34700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档