我正在将一个Python项目转换为Rails,它们都使用同一个数据库,我尝试使用Ruby来验证使用Python库passlib.hash.sha256_crypt保存的密码。我想使用Ruby来验证用户输入的密码是否是有效的,与使用任何Ruby库保存的密码相比,但是找不到合适的gem。在
使用Python Passlib库保存在SHA256中的密码示例:
$5$rounds=110000$4QB3mR7z8SVQwVDt$1jT2mdn9XHRD.O8gsCJXoUTDWJSLrY09uD8KZp78ou6
它是password
我发现的宝石是:
$5$.....
格式生成$5$.....
格式Unix Crypt是最相关的解决方案,但是为字符串“password”生成的摘要与Python生成的摘要不同。我试图从保存的摘要中删除rounds
并对其进行验证,但失败了,我想这是因为他们使用不同的rounds
来生成摘要。在
[7] pry(main)> UnixCrypt::SHA256.build("password")
=> "$5$qbpSpYyYoTCr0q4G$/jyjVRgg3Y4vQj39f9OWwUQhKOh70bTB50jH7WfsZl2"
[10] pry(main)> UnixCrypt.valid?("password", "$5$rounds=110000$4QB3mR7z8SVQwVDt$1jT2mdn9XHRD.O8gsCJXoUTDWJSLrY09uD8KZp78ou6")
=> false
[11] pry(main)> UnixCrypt.valid?("password", "$5$4QB3mR7z8SVQwVDt$1jT2mdn9XHRD.O8gsCJXoUTDWJSLrY09uD8KZp78ou6")
=> false
根据@Niel Slater的评论,我使用UnixCrypt的build
重新散列“password”,它仍然不同于Python散列字符串。在
有没有解决这个问题的方法,或者有没有更简单的方法来验证Ruby中的用户密码?我不熟悉加密,任何关于轮和摘要的详细解释也欢迎。在
您的问题是,出于某种原因,您认为}的散列。不是的。在
$5$rounds=110000$4QB3mR7z8SVQwVDt$1jT2mdn9XHRD.O8gsCJXoUTDWJSLrY09uD8KZp78ou6
是{在Python中:
在Ruby中:
^{pr2}$同时:
因此Ruby gem
unix-crypt
是解决问题的最简单的选择,因为它以最少的工作量匹配Python库passlib
(不需要找出细节,只需在整个过程中使用相同的参数和字符串值)。在相关问题 更多 >
编程相关推荐