質問: ハッシュされたパスワードと同じフィールドに塩を保存するのは安全ですか? 私のアプリケーションでパスワードをハッシュ化するためにArgon2を使うことで、私はそれがこのような文字列を生成することに気づきました(例えばパスワード "rabbit"のために): ``` $argon2i$v=19$m=65536,t=3,p=1$YOtX2//7NoD/owm8RZ8llw==$fPn4sPgkFAuBJo3M3UzcGss3dJysxLJdPdvojRF20ZE= ``` 私の理解するところによれば、 `p =` より前のものはすべてパラメータ、 `p =` の本文はソルト、そして最後の部分はハッシュされたパスワードです。 これをSQLデータベースの1つのフィールド(この場合は `varchar(99)`)に格納してもいいですか。ハッシュ化されたパスワードとは別にソルトを保存し、パラメータをコードに入れておくべきですか?
回答: ある程度安全かどうかを知るためには、塩の目的を理解しなければなりません。 塩は(私が考えることができる)いくつかの目的にかなう 1. 辞書攻撃を防ぐ 辞書攻撃は、論理的な単語がパスワードの一部として使用される場所です。原型は `password` または `P @ ssW0rd` という単語です。人は不完全であり、言葉を覚えてからランダムな文字列と数字を覚えるのが簡単です。辞書攻撃はこれを当てにしてブルートフォース攻撃の道を短くします。無作為に大量のものを追加すると、この種の攻撃は不可能または無意味になり、全体を強引に強制されます。 攻撃者が使用されているソルトを知っている場合、パスワードごとにすべての辞書ファイルを編集する必要があります。これは、ソルトが元のパスワードに追加された方法を知っていることを前提としています。辞書リストの大きな利点の1つは、1000個のパスワードと100万個の辞書の単語を使用することです。それからあなたはより弱いパスワードでいくつかの一致を得ることを試みるそれらを通って循環します。したがって、100万語を1000回編集しなければならないのは、実際には現実的ではありません。 2. ハッシュまたはレインボーテーブル攻撃を防止します。 Rainbowテーブルは、ハッシュが事前に計算されてある種のデータベースに格納される場所です。たとえば、MD5を使用してランダムなものをハッシュして保存するだけです。パスワードを解読したいときは、レインボーテーブルを見上げるだけです。 攻撃者が塩を持っている場合、彼らは使用された塩ごとにレインボーテーブルを再コンパイルする必要があります。この攻撃の利点は、そのデータを事前にコンパイルして何度も再利用することです。これにより、パスワードのブルートフォース強制に戻ります。すべてのパスワードを別々に塩漬けして塩漬けすることは、基本的にはそれぞれの塩ごとにレインボーテーブルを再計算する必要があることを意味します。そのため、パスワードごとに異なるソルトを使用することが重要です。 **要約** これらの理由のどれも本当に秘密である塩に頼りません。攻撃者がその塩を知っている場合、明らかにそれらはすべてそれほど強力ではありません。しかし、彼らが手に入れた追加の情報は常に彼らを助けます。だから私はそれを宣伝するつもりはないと思いますが、あいまいさに基づいてセキュリティについての言葉があります.... *Disclaimer* I am by no means a cryptological expert, but these are a few of the top reasons that come to my mind when I think about salts. それが役立つことを願っています。