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
虽然我个人认为这是无稽之谈,相等运算符应该是 transitive
、symetric
和 reflexive
,但 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
实例上调用 ==
方法。
我是 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
虽然我个人认为这是无稽之谈,相等运算符应该是 transitive
、symetric
和 reflexive
,但 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
实例上调用 ==
方法。