3

私はbcrypt-rubygemを試していましたが、ランダムなパスワードを生成して検証するために次のコードを記述しました

require 'bcrypt'
require 'securerandom'

def encrypt_token(tok)
    BCrypt::Password.create(tok)
end

def check_token(enc,tok)

    g = BCrypt::Password.new(enc)

    if tok==g
       puts 'equal'
    else
       puts 'not equal'
    end 
end

s = SecureRandom.hex(12)

puts s

e = encrypt_token(s)

puts e

check_token(e,s)

コードは、「等しい」ではなく「等しくない」を出力し続けます。どこが間違っているのですか?ありがとう :)

4

1 に答える 1

3

bcryptには自動ソルト機能があります。同じ文字列の2つのbcryptを比較することはできません。それらは異なります。

このように比較してみてください:

def check_token(enc,tok)

  if enc == tok #We compare it with the unencrypted string.
    puts 'equal'
  else
    puts 'not equal'
  end 

end

秘訣は、新しいbcryptを作成するときに、==演算子をオーバーライドするPasswordオブジェクトが作成されることです。パスワードが暗号化されていない文字列に対して正しいかどうかをチェックします。

また、このため、注意してください:上記の例では、enc == tok作品を比較しています。からの標準を使用するので、比較tok == encはしません==class String

ここでドキュメントとソースを見てください:http: //bcrypt-ruby.rubyforge.org/

于 2012-08-04T03:38:28.383 に答える