使用Ruby

时间:2015-09-17 08:18:33

标签: python ruby-on-rails ruby sha256

我正在将一个Python项目转换为Rails,它们都使用相同的数据库,我正在尝试使用Ruby来验证使用名为passlib.hash.sha256_crypt的Python库保存的密码。我想使用Ruby验证用户输入是否是使用任何Ruby库保存的密码的有效密码,但是找不到任何合适的gem。

使用Python Passlib库在SHA256中保存的示例密码: $5$rounds=110000$4QB3mR7z8SVQwVDt$1jT2mdn9XHRD.O8gsCJXoUTDWJSLrY09uD8KZp78ou6 这是password

我发现的宝石是:

  1. Ruby Digest library :不以$5$.....
  2. 的格式生成
  3. Unix Crypt:以相关格式生成摘要但无法验证结果
  4. Gibberish:仅在AES模式下解密,而不是以$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中的用户密码?我不熟悉加密,对圆形和摘要的任何详细解释也很受欢迎。

1 个答案:

答案 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匹配最少(不需要弄清楚细节,只需使用相同的参数和整个字符串值。