首页 文章

为什么Ruby的bcrypt lib在哈希中包含纯文本的盐? [重复]

提问于
浏览
4

这个问题在这里已有答案:

我正在使用Coda Hale的Ruby bcrypt library . 我最近注意到它没有像我认为的那样工作 . 我以为正确的程序是:

  • 生成盐

  • 获取密码

  • 连接salt和密码字符串

  • 通过散列函数对它们进行哈希处理

但是当我查看bcrypt函数的结果时,看起来盐被连接到哈希而不是密码 . 这就是在第4步之后发生的盐连接,而不是之前 . 我假设Coda Hale这样做是正确的,但我想知道它为什么会这样 .

在这里's a brief IRB session to show what'很奇怪(对我来说) . 请注意,在 hash_secret 函数的结果中,前29个字符与salt相同 . 任何关于为什么会出现这种情况的信息将不胜感激 .

我唯一的理论是盐被预先嵌入并嵌入到散列中,这样就不需要将盐存储在一个单独的DB字段中(基本上是一个记录打包策略)?

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>

1 回答

  • 4

    没有技术原因可以解决这种情况 . 如果您愿意,可以单独存储盐和密码 . 哎呀,如果你愿意的话,你可以把盐公之于众 . 我听说有些人会使用user-id作为salt来保存数据库中的一些存储空间 .

    通过在同一数据库中的不同字段中存储哈希值和盐,将无法获得安全性 . 所有真正重要的是每种盐都是独一无二的,以阻止彩虹表 .

    我想创建者决定将两个字符串连接起来只是为了将salt和hash保存在数据库或应用程序的单个字段中 . 有时这可能很有用,例如在不支持多值返回的语言中 .

相关问题