使用 Bcrypt 的正确做法

Correct practice for using Bcrypt

This guide shows how to use Bcrypt with Rails, but it differs significantly in implementation from this Rails documentation on Bcrypt.


引导版

设置密码

def password=(password)
  self.password_digest = BCrypt::Password.create(password)
end

验证密码

def is_password?(password)
  BCrypt::Password.new(self.password_digest) == password
end

但是文档使用内置方法做同样的事情。


文档版本

设置密码

设置 user.password 或同时设置 user.passworduser.password_confirmation 值,然后调用 user.save 将调用 Bcrypt 的一些回调,这些回调将获取密码值并生成摘要并将其保存在数据库中。

user.password = 'mUc3m00RsqyRe' 
user.password_confirmation = 'mUc3m00RsqyRe' 
user.save 

验证密码

方法 user.authenticate(password) 将 return false 或 user 的实例变量取决于密码参数是否匹配 user.password_digest.

user.authenticate('notright')
user.authenticate('mUc3m00RsqyRe')

问题

正确的方法是使用自 Rails 3 以来可用的 has_secure_password(记录的方法)。也许该指南基于 Rails 3 之前的实践?