使用Ruby验证Python生成的SHA256字符串

2024-09-27 23:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我发现的宝石是:

  1. Ruby Digest library :未以$5$.....格式生成
  2. Unix Crypt:生成相关格式的摘要,但无法验证结果
  3. Gibberish:只推进AES模式解密,不生成$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散列字符串。在

^{pr2}$

有没有解决这个问题的方法,或者有没有更简单的方法来验证Ruby中的用户密码?我不熟悉加密,任何关于轮和摘要的详细解释也欢迎。在


Tags: 字符串用户build密码main格式unixpassword
1条回答
网友
1楼 · 发布于 2024-09-27 23:22:23

您的问题是,出于某种原因,您认为$5$rounds=110000$4QB3mR7z8SVQwVDt$1jT2mdn9XHRD.O8gsCJXoUTDWJSLrY09uD8KZp78ou6是{}的散列。不是的。在

在Python中:

hash = sha256_crypt.encrypt("password", rounds=110000, salt='4QB3mR7z8SVQwVDt')
# '$5$rounds=110000$4QB3mR7z8SVQwVDt$hF/KhMEITeydgv58fXf2brManFYwhhy.dMqGnrkrLb1'

在Ruby中:

^{pr2}$

同时:

UnixCrypt.valid?("password", 
   "$5$rounds=110000$4QB3mR7z8SVQwVDt$hF/KhMEITeydgv58fXf2brManFYwhhy.dMqGnrkrLb1")
# => true

因此Ruby gemunix-crypt是解决问题的最简单的选择,因为它以最少的工作量匹配Python库passlib(不需要找出细节,只需在整个过程中使用相同的参数和字符串值)。在

相关问题 更多 >

    热门问题