我正在使用Coda Hale的Ruby bcrypt库。最近我注意到它的工作方式与我想象的不同。我原以为正确的流程是:
下面是一个简短的IRB会话,展示了一些奇怪的地方(对我来说)。请注意,在
我的唯一理论是,盐被添加到哈希值中,同时也被嵌入其中,这样就不需要将盐单独存储在数据库字段中(本质上是一种记录打包策略)?
- 生成一个盐
- 获取密码
- 将盐和密码字符串连接起来
- 通过哈希函数进行哈希处理
下面是一个简短的IRB会话,展示了一些奇怪的地方(对我来说)。请注意,在
hash_secret
函数的结果中,前29个字符与盐相同。如果有任何关于这种情况的信息,将不胜感激。我的唯一理论是,盐被添加到哈希值中,同时也被嵌入其中,这样就不需要将盐单独存储在数据库字段中(本质上是一种记录打包策略)?
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>