为什么Ruby';s bcrypt lib是否在哈希中包含明文形式的salt?

为什么Ruby';s bcrypt lib是否在哈希中包含明文形式的salt?,ruby,bcrypt,bcrypt-ruby,Ruby,Bcrypt,Bcrypt Ruby,我用的是Coda Hale's。我最近注意到它不像我想象的那样工作。我认为正确的程序是: 生盐 获取密码 连接salt和密码字符串 通过散列函数对它们进行散列 但当我查看bcrypt函数的结果时,似乎salt连接到了散列,而不是密码。也就是说,salt连接发生在步骤4之后,而不是之前。我假设Coda Hale做得对,但我想知道为什么它会这样 这里有一个简短的IRB会议来展示(对我来说)什么是奇怪的。请注意,在hash_secret函数的结果中,前29个字符与salt相同。如能提供任何有关情况原因

我用的是Coda Hale's。我最近注意到它不像我想象的那样工作。我认为正确的程序是:

  • 生盐
  • 获取密码
  • 连接salt和密码字符串
  • 通过散列函数对它们进行散列
  • 但当我查看bcrypt函数的结果时,似乎salt连接到了散列,而不是密码。也就是说,salt连接发生在步骤4之后,而不是之前。我假设Coda Hale做得对,但我想知道为什么它会这样

    这里有一个简短的IRB会议来展示(对我来说)什么是奇怪的。请注意,在
    hash_secret
    函数的结果中,前29个字符与salt相同。如能提供任何有关情况原因的信息,将不胜感激

    我唯一的理论是,salt是预先准备好的,并且嵌入到散列中,这样就不需要将salt存储在单独的DB字段中(本质上是一种记录打包策略)


    这种情况没有技术上的原因。如果您愿意,您可以分别存储salt和密码。见鬼,如果你想的话,你可以把盐公之于众。我听说有些人会使用用户id作为salt,以节省数据库中的一些存储空间

    在同一数据库的不同字段中存储散列和盐不会带来安全收益。真正重要的是,每一种盐都是独一无二的,以阻止彩虹表


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

    这样就不需要将salt与散列分开存储。salt已与密码连接以生成哈希,但salt随后被附加连接到哈希上(以及关于哈希算法的其他元数据),因此只需要单个字符串来测试哈希。此外,哪一个可能是更好的资源。@MichaelBerkowski-同意-我希望我在问这个问题之前看到第二个问题(我确实搜索过!)。我投票将其标记为重复,因为这回答了我的具体问题。这也是在UNIX类型的系统上如何保存密码,其中有一个单独的字段用于存储哈希密码。该字符串包括关于散列方法、salt的信息,以及根据相当标准的格式进行散列的信息。这样,如果将来更改哈希方法,则旧的哈希密码仍然有效。值得注意的是,如果没有已知的salt和散列方法,就不可能复制散列。
    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>