1

これは、ユーザーが登録するときにユーザーのパスワードをソルトしてハッシュする必要があるコードです (一貫してハッシュされていたため、実際のパスワードのハッシュは削除されています)。コードの最初のブロックを使用すると、ユーザーが登録した後にデータベースで見つけたソルトをハッシュしようとすると、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".

4

0 に答える 0