对于PBKDF2,使用HMAC-SHA256比使用HMAC-SHA-1更安全吗?

时间:2014-05-30 03:01:25

标签: java cryptography sha pbkdf2 hmacsha1

我正在寻找适当的密码加密Java算法,我发现Java SDK提供了PBKDF2WithHmacSHA1,但没有提供PBKDF2WithHmacSHA256。

我听说HMAC-SHA256比HMAC-SHA-1需要更多的时间。

由于系统资源有限, 只要服务要求能够承受,我就会应用不同的迭代值来使它们最安全。

即使使用相同的预期处理时间,使用HMAC-SHA256比使用HMAC-SHA-1更安全吗?

如果是这样,你能描述使用HMAC-SHA256比使用HMAC-SHA-1安全吗?

1 个答案:

答案 0 :(得分:6)

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适用于任何需要在未来几分钟内保证安全的东西是有疑问的。

Con#2: SHA-1被打破"从理论上讲,已发现的攻击仍然非常昂贵,据我所知,他们都是生日攻击(不会帮助你打破密码数据库)而不是预映像攻击(哪个)。此外,由于PBKDF2使用散列的多次迭代,将散列输出的轮次与密码反复组合,因此难以将对散列的攻击扩展为对PBKDF2的攻击。对SHA-1进行非常严重攻击会使PBKDF2-SHA-1不安全。

总的来说,我认为您应该首选PBKDF2-SHA-256,但如果它不可用,PBKDF2-SHA-1仍然被广泛使用,并且是中等安全密码散列的合理选择这一次。