2016-06-09 3 views
2

안녕하세요 메신저 레일에 Bcrypt, 지금은 패스워드 해시를 만들 수 있었지만 패스워드에 대한 사용자 입력과 비교할 때이 보석을 올바르게 사용하는 방법에 대해 궁금합니다. 일치하지 않습니다.레일에 Bcrypt 루비

여기에 암호화 및 로그인 코드가 있습니다.

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 

add_user에서는 로그인 기능을 사용하여 로그인 할 때 encrypt_password 함수를 사용하여 암호화했습니다. 암호가 데이터베이스에서 암호화 된 암호와 일치하지 않습니다. 나는 올바른 방법으로 이것을하지 않는 것이 확실하다. 내가 잘못하고있는 부분을 지적 할 수 있겠 니? 감사.

+0

참고로, 해시 중괄호는 'x ({...})'형식의 호출에서 루비에서 암시 적이기 때문에 생략 할 수 있습니다. 예를 들면 다음과 같습니다 :'User.create (: username => user [ 'username'], ...)'또는 더 좋은'User.create (username : user [ 'username'], ...)' 표기법. – tadman

+0

메모를 보내 주셔서 감사합니다.하지만 지금은 내 관심사가 아닙니다. –

답변

4

여기에있는 속임수는 설계 상 동일한 암호로 실행할 때마다 BCrypt이 다른 결과를 생성한다는 것입니다. 이것은 함수의 출력을 예측할 수 없도록 만든다. 그래서 무작위 추측 패스워드는 실용적이지 않다.

당신이 확인하는 방법은 다음과 같습니다 당신이 확인

hashed_password = BCrypt::Password.create(user['password']) 

방법은 다음과 같습니다

== 방법은 암호 객체에 대해 재정의하기 때문에이 작동
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 

. 리터럴 문자열 비교를 수행하지 않습니다.

+0

로그인 기능을 이렇게 변경했습니다. \t 데프 self.login 거짓 (사용자) \t \t 결과 = \t \t hashed_password = encrypt_password (사용자 [ "패스워드"]) \t \t 사용자 User.where = ({자명 => 사용자 [ "이름"] }) \t \t 경우 BCrypt :: Password.new (hashed_password) == 사용자 [0] .password \t \t \t 결과 = TRUE \t \t \t \t 단부 반환 결과 \t end 잘못된 해시 결과를 제공합니다. 그게 무슨 뜻 이죠? –

+0

나는 'user'와'user'를 혼동했기 때문에 여기서 편집해야했습니다. – tadman

+0

도움을 주셔서 감사합니다. 효과가있었습니다. –