在轨道上加密红宝石

Joh*_*rte 2 ruby ruby-on-rails bcrypt

嗨,我是Bcrypt的新手,我想知道如何正确使用此gem,到目前为止,我已经能够对密码进行哈希处理,但是在将其与用户输入的密码进行比较时,它不匹配。

这是我用于加密和登录的代码。

def self.login(user)
    hashed_password = encrypt_password(user["password"])
    result = User.where({:username => user["username"], :password => hashed_password})
    return result
end

def self.add_user(user)
    hashed_password = encrypt_password(user["password"])
    result = User.create({:username => user["username"],
        :password => hashed_password,
        :firstname => user["firstname"],
        :middle_initial => user["middle_initial"],
        :lastname => user["lastname"],
        :advisory_class => user["advisory_class"]})
    return result
end

def self.encrypt_password(password)
    password_salt = BCrypt::Engine.generate_salt
    password_hash = BCrypt::Engine.hash_secret(password,password_salt)
end
Run Code Online (Sandbox Code Playgroud)

在add_user中,使用登录功能登录时,我正在使用crypto_password功能对其进行加密。密码与数据库中加密的密码不匹配。即时消息,我确定自己的做法不正确,您能指出我做错了什么吗?谢谢。

tad*_*man 5

诀窍在于,每次设计时使用相同的密码运行BCrypt时,它都会创建不同的结果。这使得该函数的输出极为不可预测,因此强行猜测密码是不现实的。

您验证的方式是:

hashed_password = BCrypt::Password.create(user['password'])
Run Code Online (Sandbox Code Playgroud)

您验证的方式是:

if @user = User.where(username: user['username'])
  # User found

  if BCrypt::Password.new(@user.password) == user['password']
    # Success!
  else
    # Invalid password
  end
else
  # User not found
end
Run Code Online (Sandbox Code Playgroud)

之所以==可行,是因为该方法被Password对象覆盖。它没有进行文字字符串比较。