【发布时间】:2014-11-12 04:38:37
【问题描述】:
我正在使用 Coda Hale 的 Ruby bcrypt library。我最近注意到它并没有像我想象的那样工作。我原以为正确的程序是:
- 生成盐
- 获取密码
- 连接盐和密码字符串
- 通过散列函数对它们进行散列
但是当我查看 bcrypt 函数的结果时,似乎盐连接到 hash 而不是 password。那就是盐连接发生在步骤#4之后,而不是之前。我假设 Coda Hale 做得对,但我想知道它为什么会这样。
这是一个简短的 IRB 会议,展示了(对我而言)奇怪之处。请注意,在 hash_secret 函数的结果中,前 29 个字符与 salt 相同。任何关于为什么会这样的信息将不胜感激。
我唯一的理论是盐是预先添加的以及嵌入在散列中,这消除了将盐存储在单独的数据库字段中的需要(本质上是一种记录打包策略)? p>
irb#1(main):004:0> password_salt = BCrypt::Engine.generate_salt
=> "$2a$10$OrKdcWORLL8Gorhy9XR3UO"
irb#1(main):005:0> password='abc'
=> "abc"
irb#1(main):006:0> BCrypt::Engine.hash_secret(password, password_salt)
=> "$2a$10$OrKdcWORLL8Gorhy9XR3UOY8Sebzq92m7r02XPitzoazPdO7tmsEO"
irb#1(main):007:0>
【问题讨论】:
-
这样盐就不需要与哈希分开存储。盐已与密码连接以产生哈希,但盐随后被额外连接到哈希上(连同有关哈希算法的其他元数据),因此只需要单个字符串来测试哈希。
-
还有How can bcrypt have built-in salts?,这可能是一个更好的资源。
-
@MichaelBerkowski - 同意 - 我希望在问这个问题之前我已经看到了第二个问题(我确实搜索过!)。我已投票将其标记为重复,因为这回答了我的具体问题..
标签: ruby bcrypt bcrypt-ruby