Ruby BCrypt哈希比较不起作用

时间:2016-04-25 05:46:53

标签: ruby hash bcrypt

我是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_pa​​ssword正在返回一个哈希并且!= user_input_password_attempt 我已经阅读了Ruby-Doc并广泛搜索了这个

1 个答案:

答案 0 :(得分:0)

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

a == b

相当于

a.==(b)

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

a == b

可能会或可能不会返回与

不同的结果
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方法。