Ruby BCrypt 哈希比较无效

Ruby BCrypt hash comparison not working

我是 Ruby 的新手,如果这个问题已经得到解答,我深表歉意。我已经阅读了其他问题,但仍然无法弄清楚我做错了什么。

我正在创建散列密码以存储在这样的数据库中:

new_user.password = BCrypt::Password.create(unhashed_password)
# Write the user to database
new_user.store_user

然后我通过检查输入的用户名从数据库中检索用户,然后像这样检查密码:

# Get user from the database
def self.get_user(check_user_name)
db = User.open_db
user = User.new
user_arr = db.execute("SELECT * FROM user_data WHERE user_name = ?", check_user_name).first
db.close
# if the user exists check the password
if user_arr.size != 0
  print "Enter your password  : "
  # Get password from user
  user_input_password_attempt = gets.chomp
end
# Parse the db user into a user class if password guess is correct
stored_password = BCrypt::Password.new(user_arr[2])
if user_input_password_attempt == stored_password
  @@users_logged_in += 1
  user.user_id = user_arr[0]
  user.user_name = user_arr[1]
  user.password = user_arr[2]
  return user
end
:no_user

结束

我的问题是 var stored_password 正在返回一个散列和 != user_input_password_attempt 我已阅读 Ruby-Doc 并在谷歌上广泛搜索

当您使用 == 时,您实际上是在调用左侧对象上定义的 == 方法,将右侧作为参数传递:

a == b

等同于

a.==(b)

根据您调用 == 方法的对象,您可能会收到不同的结果。换句话说:

a == b

可能会或可能不会 return 与

不同的结果
b == a

虽然我个人认为这是无稽之谈,相等运算符应该是 transitivesymetricreflexive,但 BCrypt 人员已决定以另一种方式实现它:

def ==(secret)
  super(BCrypt::Engine.hash_secret(secret, @salt))
end

(取自http://bcrypt-ruby.rubyforge.org/classes/BCrypt/Password.html#M000009

这意味着你必须写:

stored_password = BCrypt::Password.new(user_arr[2])
if stored_password == user_input_password_attempt
  ...
end

为了在 Password 实例上调用 == 方法。