我正在将一个Python项目转换为Rails,它们都使用相同的数据库,我正在尝试使用Ruby来验证使用名为passlib.hash.sha256_crypt的Python库保存的密码。我想使用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
来重新设置“密码”,它仍然与Python哈希字符串不同。
[81] pry(main)> UnixCrypt::SHA256.build("password", "4QB3mR7z8SVQwVDt", 110000)
=> "$5$rounds=110000$4QB3mR7z8SVQwVDt$hF/KhMEITeydgv58fXf2brManFYwhhy.dMqGnrkrLb1"
有关此问题的任何解决方法,还是有任何更简单的方法来验证Ruby中的用户密码?我不熟悉加密,对圆形和摘要的任何详细解释也很受欢迎。
答案 0 :(得分:0)
您的问题是您认为$5$rounds=110000$4QB3mR7z8SVQwVDt$1jT2mdn9XHRD.O8gsCJXoUTDWJSLrY09uD8KZp78ou6
由于某种原因是password
的哈希值。事实并非如此。
在Python中:
hash = sha256_crypt.encrypt("password", rounds=110000, salt='4QB3mR7z8SVQwVDt')
# '$5$rounds=110000$4QB3mR7z8SVQwVDt$hF/KhMEITeydgv58fXf2brManFYwhhy.dMqGnrkrLb1'
在Ruby中:
UnixCrypt::SHA256.build("password",'4QB3mR7z8SVQwVDt', 110000 )
# "$5$rounds=110000$4QB3mR7z8SVQwVDt$hF/KhMEITeydgv58fXf2brManFYwhhy.dMqGnrkrLb1"
此外:
UnixCrypt.valid?("password",
"$5$rounds=110000$4QB3mR7z8SVQwVDt$hF/KhMEITeydgv58fXf2brManFYwhhy.dMqGnrkrLb1")
# => true
所以Ruby gem unix-crypt
是你问题最简单的选择,因为它与Python库passlib
匹配最少(不需要弄清楚细节,只需使用相同的参数和整个字符串值。