为Grails / Spring Security REST用户手动计算bcrypt“哈希”(并保存在db中)

时间:2015-03-11 19:11:30

标签: grails spring-security bcrypt

我需要在数据库中批量设置数百个密码。虽然我意识到我可以编写某种服务来通过Grails,但要求是我在SQL中严格执行更新。

我并不是说我需要使用一些DB内置的encrypt()或password()函数,我只是意味着覆盖user.password字段应该是SQL脚本的。出于安全/日志记录的原因,我宁愿在数据库中进行散列。

只要可以轻松实现哈希的自动化,哈希的生成方式就是敞开的 - 越简单越好。 (是的,加密纯粹主义者,我认识到bcrypt输出不是真正的哈希。)我尝试了几件事,一件有效,但是时间过长而另一件只是"没有工作&#34 ; (Grails在身份验证期间拒绝密码):

  1. http://bcrypthashgenerator.apphb.com/有一个在线生成工具。如果我去这里并输入一个字符串,然后将该输出保存为数据库中用户的密码字段,则一切正常。但是,他们已经内置了防止自动拨打电话的保护措施,而且我会尊重他们的意愿,而不是试图四处走动。

  2. 有一个内置于PHP的password_hash函数支持bcrypt。我已尝试使用此调用的输出,但Grails不喜欢它(即,它告诉我我的密码无效):echo password_hash('test', PASSWORD_BCRYPT)。如果我能够以某种方式让它发挥作用,它就足够轻松地反复点击并收集我的输出。

  3. 优先选择i)找到有用的东西,但ii)想知道为什么选项#2不会,但#1会这样做。

1 个答案:

答案 0 :(得分:2)

在5.3.7之后,PHP的密码_hash()使用$2y$前缀,而该网站(可能是您的安装)使用$2a$

  

$ 2a $ - 用于识别此方案的当前密钥。一个专业   2011年在第三方实施中发现了安全漏洞   对于算法,[12]此字符串表示的哈希值现在是   暧昧,可能是由有缺陷的实施产生的,   或者随后的固定实施。这个缺陷可能是由   一些包含非ASCII字符的密码字符串,例如   特制的密码字符串。

     

$ 2y $ - 2011年后的错误发现,$ 2y $可用于明确使用   新的,纠正的算法。关于实施遭受的   错误,$ 2y $简直无法工作。在一个较新的,固定的实现,它将   产生与使用$ 2a $相同的结果。

因此,您的Grails安装看起来像是使用易受攻击的bcrypt版本。如果它被修补,PHP编码的$2y$版本将(应该?)工作。