对于 PBKDF2,使用 HMAC-SHA256 是不是比使用 HMAC-SHA-1 更安全?
Posted
技术标签:
【中文标题】对于 PBKDF2,使用 HMAC-SHA256 是不是比使用 HMAC-SHA-1 更安全?【英文标题】:For PBKDF2, using HMAC-SHA256 is more secure than using HMAC-SHA-1?对于 PBKDF2,使用 HMAC-SHA256 是否比使用 HMAC-SHA-1 更安全? 【发布时间】:2014-07-19 17:26:28 【问题描述】:我正在寻找合适的 Java 密码加密算法,我发现 Java SDK 提供 PBKDF2WithHmacSHA1,但不提供 PBKDF2WithHmacSHA256。
我听说 HMAC-SHA256 会比 HMAC-SHA-1 花费更多时间。
由于系统资源有限, 只要服务需求能够承受,我将应用不同的迭代值以使它们最安全。
即使进程的预期时间相同,使用 HMAC-SHA256 比使用 HMAC-SHA-1 更安全?
如果是这样,您能否描述一下使用 HMAC-SHA256 比使用 HMAC-SHA-1 有多安全?
【问题讨论】:
【参考方案1】:Pro #1: SHA-256 的哈希值比 SHA-1 长(256 位与 160 位),因此使用纯暴力发现冲突的机会要低得多。即使调整了迭代次数以使计算单个 PBKDF2 散列的时间相同,您也必须散列 2^96 倍的随机输入才能与 PBKDF2-SHA-256 匹配,而不是与 PBKDF2-SHA-1 匹配
Con #1:没有人使用纯暴力攻击密码哈希,他们使用字典攻击、混合字典攻击和有限字符集攻击。所有这些都使用足够小的有限输入空间,PBKDF2-SHA-1 和 PBKDF2-SHA-256 都不太可能发生任何自然冲突。有限的密码搜索空间使得散列的大小无关紧要,只要它“足够大”,因此影响攻击难度的唯一因素是计算单个 PBKDF2 散列的时间。此外,PBKDF2 有一种将输出长度拉伸到比底层哈希长度更长的方法,因此您实际上可以使两者具有相等的输出空间。
Pro #2: SHA-1 至少部分损坏;密码分析导致attacks 可以比蛮力更快地发现冲突。一旦发现攻击,您通常可以期望它会得到改进——这意味着 SHA-1 是否适用于需要在未来几分钟内得到保护的任何事物都是值得怀疑的。
骗局 #2: SHA-1 在理论上是“被破坏的”,但是已经发现的攻击仍然非常昂贵,据我所知,它们都是生日攻击(其中不会帮助您破坏密码数据库)而不是图像前攻击(这样做)。此外,由于 PBKDF2 使用了多次哈希迭代,一遍又一遍地将几轮哈希输出与密码相结合,因此很难将对哈希的攻击扩展到对 PBKDF2 的攻击。要使 PBKDF2-SHA-1 不安全,需要对 SHA-1 进行非常严重的攻击。
总的来说,我认为您应该在一般原则上更喜欢 PBKDF2-SHA-256,但如果它不可用,PBKDF2-SHA-1 仍然被广泛使用,并且是目前中等安全性密码散列的合理选择。
【讨论】:
以上是关于对于 PBKDF2,使用 HMAC-SHA256 是不是比使用 HMAC-SHA-1 更安全?的主要内容,如果未能解决你的问题,请参考以下文章
PBKDF2-HMAC-SHA256 for JAVA 的可靠实现