为了安全地哈希密码,我应该使用哪种算法? BCrypt
或PBKDF2WithHmacSHA1
?
哪个更安全? PBKDF2WithHmacSHA1
内置于Java中,而BCrypt
可通过jBCrypt库获得(其中大多数都获得了正面评价)。
此外,如果我使用BCrypt
,我应该将用户的密码输入限制为仅限55个字符(因为这是BCrypt
的限制)?
如果您Java
具体,那将会很有帮助
请注意,我会选择使密码更安全,更难以强制使用。
答案 0 :(得分:4)
它们不一样,并且它们不是同样安全的。
在CPU上,它们都使用大约相同数量的资源,并且在保护密码方面大致相同。
问题归结为基于GPU的攻击。由于GPU的体系结构,bcrypt实际上比SHA1(或SHA256)更难运行。因此,PBKDF2 + sha1的并行化比bcrypt更容易。
要在其上添加一些实际数字,我们将从This presentation中提取。
Sha-1比md5贵3倍。因此,如果我们看一下慢速哈希函数幻灯片,我们可以得出结论,md5crypt比pbkdf2-sha1快约3倍。这是一个相当多的猜测,但它正处于我们正在寻找的范围内。
这意味着,对于等效的CPU运行时,我们可以预期PBKDF2-sha1在GPU集群上每秒运行大约2500万个哈希值。将其与BCrypt(成本5)进行比较,后者以每秒75千赫兹的速度运行。
这意味着在相同的成本设置下,PBKDF2 + sha1比bcrypt弱约1000倍。
请注意,PBDFK2 + sha512几乎和bcrypt一样慢。这与使用64位操作的SHA-512有关(在当今的GPU中它们不是原生的)。
简而言之,bcrypt比PBKDF2 + SHA1更安全。它比PBKDF2 + SHA512更安全,但没有多少余量。
这依赖于今天的GPU架构。将来,如果缓存大小和指令集发生显着变化,这些差异可能会消失。这就是为什么像scrypt这样的新算法存在的原因。
所以只需使用bcrypt。 And don't worry about the character limit
答案 1 :(得分:2)
这并不重要。
两者的安全性之间的差异并不足以达到有意义的选择。但是,如果您正在寻找一个彻底的讨论,请查看Eugene的评论中的两个链接
重要的是你正确的。
这意味着:
&#34;另外,如果我使用BCrypt,我应该将用户的密码输入限制为仅55个字符(因为这是BCrypt的限制)?&#34; < / p>
没有。使用SHA1或SHA256对密码进行一次哈希处理,并使用输出,就像之前使用过的密码一样。如果你想涂胡椒,这是做这个的地方。最后,如果听起来很麻烦,这可能是使用PBKDF2而不是bcrypt的决定性因素。