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

时间:2014-09-18 00:43:12

标签: ruby bcrypt bcrypt-ruby

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

  1. 生成盐
  2. 获取密码
  3. 连接salt和密码字符串
  4. 通过哈希函数哈希它们
  5. 但是当我查看bcrypt函数的结果时,看起来salt被连接到 hash 而不是密码。这就是在第4步之后发生的盐连接,而不是之前。我假设Coda Hale这样做是正确的,但我想知道它为什么会这样。

    这是一个简短的IRB会议,以显示什么是奇怪的(对我来说)。请注意,在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 个答案:

答案 0 :(得分:4)

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

通过在同一数据库中的不同字段中存储哈希值和盐,不会获得任何安全性增益。真正重要的是每种盐都是独特的,以阻止彩虹表。

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