これは、ユーザーが登録するときにユーザーのパスワードをソルトしてハッシュする必要があるコードです (一貫してハッシュされていたため、実際のパスワードのハッシュは削除されています)。コードの最初のブロックを使用すると、ユーザーが登録した後にデータベースで見つけたソルトをハッシュしようとすると、password_digest に保存されるものとは異なるものにハッシュされます。ただし、コードの 2 番目または 3 番目のブロックを使用すると、それらは同じものにハッシュされます。これは、私が望む動作です。
salt = rand
write_attribute :password_digest, Digest::SHA1.hexdigest("#{salt}")
write_attribute :salt, salt
対。
salt = "#{rand}"
write_attribute :password_digest, Digest::SHA1.hexdigest(salt)
write_attribute :salt, salt
[編集]
また
salt = rand
write_attribute :password_digest, Digest::SHA1.hexdigest("#{salt}")
write_attribute :salt, "{#salt}"
salt
とはどちらもpassword_digest
タイプ:string
です。
[編集終了]
どうしてこれなの?彼らはまったく同じ振る舞いをするべきだと私には思えます。"#{salt}"
ハッシュせずに password_digest に直接格納すると、salt
属性と正確に一致するため、ハッシュがいつ発生するかに関係なく、同じものにハッシュする必要があるようです。さらに、この同じ関数を呼び出してパスワードを設定することを含むデータベースに手動でユーザーを作成すると、使用しているコードのブロックに関係なくハッシュが適切に一致するため、ハッシュの競合はユーザーを作成するときにのみ発生するようですブラウザフォーム。
[編集] コードの 3 番目のブロックは、明示的に強制せずにソルトで write_attribute を呼び出すことを示しているようです (これは正しい用語ですか?)、それを文字列にすると、データベースに格納されるときにソルトの値が何らかの形で変更されます...これは私にはありそうにないようです。
[編集] コードの動作の最初のブロックの例を示すには: データベースでは、
password_digest = "2f4d39ae81f480f6ad8a759eec6b8b386fbdf636"
と
salt = 0.17127103546001
.
ただし、Digest::SHA1.hexdigest("0.17127103546001") = "c46566206c072dd453220dac835de6204e64c044"
.