【发布时间】:2012-04-25 18:22:53
【问题描述】:
我想使用has_secure_password 将加密密码存储在数据库中。如果has_secure_password 使用任何形式的盐渍,我在互联网上找不到。如果它使用盐渍,它是如何工作的?谁能帮我澄清一下?
提斯
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 encryption passwords salt
我想使用has_secure_password 将加密密码存储在数据库中。如果has_secure_password 使用任何形式的盐渍,我在互联网上找不到。如果它使用盐渍,它是如何工作的?谁能帮我澄清一下?
提斯
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 encryption passwords salt
has_secure_password 使用bcrypt-ruby。 bcrypt-ruby 自动为您处理盐的存储和生成。来自bcrypt-ruby 的典型哈希如下所示:$2a$10$4wXszTTd7ass8j5ZLpK/7.ywXXgDh7XPNmzfIWeZC1dMGpFghd92e。使用以下函数在内部拆分此哈希:
def split_hash(h)
_, v, c, mash = h.split('$')
return v, c.to_i, h[0, 29].to_str, mash[-31, 31].to_str
end
对于这个函数产生的示例哈希:
BCrypt::Password 的==-函数提取盐并将其应用于传递的字符串:
BCrypt::Password.create('bla') == 'bla' # => true
【讨论】:
password_digest 列中的散列密码连接起来。见github.com/codahale/bcrypt-ruby#salts
BCrypt::Password.create('indu') 时,每次调用都会得到不同的哈希值(如预期的那样)。