将密码哈希从SHA转换为bcrypt

4
这个问题已经在这个Stack Overflow问题中得到了回答,但它不是Grails特定的,而且也有点模糊。
我使用Spring Security设置了我的Grails应用程序,但显然没有获取最新版本,因为它默认使用SHA-256而不是bcrypt进行哈希。现在我有生产数据,其中密码似乎使用不太理想的方法进行了哈希。
启用bcrypt哈希实际上非常容易:
Config.groovy > grails.plugins.springsecurity.password.algorithm = 'bcrypt'

但现在我需要这个应用程序将旧哈希转换为新哈希。从根本上讲,我理解当用户登录时,应该让应用程序检查密码是否为SHA-256哈希,如果是,则使用bcrypt重新哈希输入的密码。过一段时间后,它们都会升级,然后可以删除该代码。
不过,实际上如何确定密码哈希是来自SHA-256还是bcrypt的代码呢?
编辑
也就是说,我要调用哪个实际函数来获取哈希? 我如何bcrypt(incomingpassword)以查看它是否与现有密码哈希匹配?
1个回答

7

bcrypt密码将以"$2a$10$"开头,长度为60个字符。SHA-256没有模式,但长度为64个字符。


7
我觉得这很有趣并且值得记录下来,因此我制作了一个实现,并在这里发布了一篇博客文章:http://burtbeckwith.com/blog/?p=2017 - Burt Beckwith
使用SHA-256的设置或任何旧算法 - bcrypt编码器已明确配置。一旦准备好切换到单个算法,请删除所有内容,并像新应用程序中那样配置bcrypt。 - Burt Beckwith
2
你可能还需要 grails.plugin.springsecurity.password.hash.iterations = 1,因为1.2插件使用了1次迭代,而2.0插件默认为10,000。 - Burt Beckwith
Spring Security是否能理解这种哈希格式?文档中的示例密码位于http://docs.spring.io/spring-security/site/docs/3.2.2.RELEASE/reference/htmlsingle/#ns-password-encoder,但其格式不同...? - Jules
这是Spring Security,只是Grails的包装器。我不确定文档上有什么问题,但密码不是bcrypt哈希。 - Burt Beckwith
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接