我需要在数据库中批量设置数百个密码。虽然我意识到我可以编写某种服务来通过Grails,但要求是我在SQL中严格执行更新。
我并不是说我需要使用一些DB内置的encrypt()或password()函数,我只是意味着覆盖user.password字段应该是SQL脚本的。出于安全/日志记录的原因,我宁愿不在数据库中进行散列。
只要可以轻松实现哈希的自动化,哈希的生成方式就是敞开的 - 越简单越好。 (是的,加密纯粹主义者,我认识到bcrypt输出不是真正的哈希。)我尝试了几件事,一件有效,但是时间过长而另一件只是"没有工作&#34 ; (Grails在身份验证期间拒绝密码):
http://bcrypthashgenerator.apphb.com/有一个在线生成工具。如果我去这里并输入一个字符串,然后将该输出保存为数据库中用户的密码字段,则一切正常。但是,他们已经内置了防止自动拨打电话的保护措施,而且我会尊重他们的意愿,而不是试图四处走动。
有一个内置于PHP的password_hash函数支持bcrypt。我已尝试使用此调用的输出,但Grails不喜欢它(即,它告诉我我的密码无效):echo password_hash('test', PASSWORD_BCRYPT)
。如果我能够以某种方式让它发挥作用,它就足够轻松地反复点击并收集我的输出。
优先选择i)找到有用的东西,但ii)想知道为什么选项#2不会,但#1会这样做。
答案 0 :(得分:2)
在5.3.7之后,PHP的密码_hash()使用$2y$
前缀,而该网站(可能是您的安装)使用$2a$
。
$ 2a $ - 用于识别此方案的当前密钥。一个专业 2011年在第三方实施中发现了安全漏洞 对于算法,[12]此字符串表示的哈希值现在是 暧昧,可能是由有缺陷的实施产生的, 或者随后的固定实施。这个缺陷可能是由 一些包含非ASCII字符的密码字符串,例如 特制的密码字符串。
$ 2y $ - 2011年后的错误发现,$ 2y $可用于明确使用 新的,纠正的算法。关于实施遭受的 错误,$ 2y $简直无法工作。在一个较新的,固定的实现,它将 产生与使用$ 2a $相同的结果。
因此,您的Grails安装看起来像是使用易受攻击的bcrypt版本。如果它被修补,PHP编码的$2y$
版本将(应该?)工作。