我现在有一个Grails网络应用程序,它使用带有唯一salt的SHA-256将用户密码存储在我的数据库中。我最近将Web应用程序升级到Grails的最新版本的Spring Security插件(2.0RC2)(2.3.4)。新插件默认使用BCrypt。我的问题是,哪一个更好,为什么他们会切换到BCrypt。我读过关于爱BCrypt的人和讨厌BCrypt的人的文章。我看到的一个直接专业人员是算法中内置了盐析,因此我不必单独存储盐。我还注意到你可以在SHA-256上设置迭代。从我读到的,很多人喜欢BCrypt,因为你也可以为它设置迭代,但是这与设置SHA-256的迭代有什么不同?一篇博客说,PBKDF2是一个非常优越的选择,因为它已经过测试。但我也听到了关于BCrypt的同样的事情......
答案 0 :(得分:4)
bcrypt和PBKDF2都是众所周知的算法。只要你在边界内使用它们,其中任何一个都应该没问题。
当然,您可以使用SHA-256使用迭代计数和salt创建类似的方案。但除非您提出自己的安全证明,测试,社区等,否则您应该使用已知或标准化的算法(如果可用)。
PBKDF2确实在下面使用哈希算法,因此可以为SHA-256配置 - 如果实现允许的话。
目前唯一的另一个选择是scrypt。 scrypt可以说更安全,因为它依赖于相对大量的内存。因此,scrypt更难以并行化,例如,使用矢量机器,如GPU。
到目前为止,password hashing competition已经完成,它提供了一些有趣的选择,例如获胜者Argon2。
答案 1 :(得分:3)
没有“他们”,只是我:)
您可以设置SHA-256的迭代计数,但它不会减慢速度,例如增加bcrypt的logrounds值。你可以使bcrypt非常慢,这确实使用户的登录速度变慢,但这一般不是什么大问题。但是如果您的数据库受到损害,它确实会使暴力破解密码成本更高。