OK最近パスワードハッシュについてたくさん勉強しています。そして、いくつか質問があります。私が知っていることを説明します(途中でどこかに問題があった場合は、訂正してください)、私の混乱がどこにあるかを示します。
したがって、ユーザーのパスワードをハッシュ化する理由は、ハッカーがデータベースを手に入れたら、メールを使用してパスワードを入力するだけでお金を盗むことができないためです。また、管理者が自分のパスワードが何であるかを見ることができないようにします。つまり、ユーザーの安全を守ることが肝心です。
MD5
のようなハッシュを使用するだけでは十分ではありません。レインボーテーブルを使用すると、パスワードがすぐにわかるので、ソルト処理の有無に関係なく、高速のコンピュータでクラックできます。
ただし、レインボーテーブルを使用できないようにハッシュするときにソルトを使用することが重要であり、ハッカーはブルートフォースでパスワードを見つけ出す必要があります。それで、ソルトを保存するときに、ハッシュに追加することで、<hash>_<salt>
と言いましょう。ハッカーはハッシュをブルートフォースに強制するため、プレーンテキストであるかどうかは問題ではありません。
それでは私の質問に移ります。
1。コードからソルトを暗号化して、データベースに保存しないのはなぜですか?
私がこれをしたとしたら、ハッカーが力ずくでパスワードを取得することは不可能です。なぜなら、ソルトはプレーンテキストではないのにプレーンテキストであると想定するからです。そのため、彼らはパスワードを考えてみて、決して思い付くことはありませんでした。しかし、これは私の2番目の質問につながります。
2。ハッカーは、データベースを見たときに使用したハッシュアルゴリズムの種類をどのようにして知ることができますか?
Bcryptを使用してパスワードをハッシュしてから、scryptを使用してそれを繰り返しハッシュした場合、ハッシュの順序を理解するには、コードを確認するしかありません。
わかりやすく説明するために、シナリオを作成しましょう。ハッカーは、SQLインジェクションの何らかの形式を使用してユーザーリスト全体を印刷し、ハッシュされたパスワードを含む電子メールを1000行取得します。これらのパスワードは、コードにのみ保存されているキーで暗号化された私のソルトを追加しました。ハッカーはソルトが暗号化されていることをどうやって知るのでしょうか?そして、もし彼がそれが暗号化されていることをどういうわけか識別した場合、彼は鍵を持っていない限りソルトを解読することはできません。キーを取得する唯一の方法は、彼が私のコードにアクセスできるかどうかです。彼が私のコードにアクセスできた場合、その時点で、パスワードをハッシュ化してソルト処理した方法を正確に確認できるので、とにかく私のキーを持っているかどうかに関係なく、簡単にプロセスを複製し、ブルートフォースでパスワードを取得することができます。したがって、saltの暗号化などの操作を行うと、コードにアクセスできなかったハッカーがパスワードを突き止めることができなくなります。これは本当ではないですか?そうでない場合は、詳しく説明してください。 = D
ハッカーがあなたのデータベースを手に入れようと仮定します。
暗号化されたソルトをデータベースに保存するとどうなるかを分析しましょう。暗号化されたソルトを利用するハッシュ関数は、復号化されるまでソルトを使用できません。したがって、コードは暗号化されたソルトを要求し、キーで復号化する必要があります。このキーはコード内にあると想定できます。
ハッカーはあなたのデータベースを持っているので、彼らは暗号化されたソルトを持っています。今、彼らは本当に鍵だけが必要です。あなたの例では、キーはコードに格納されています。通常のソルトもコードに格納されます。 ここでは、セキュリティをまったく追加していません。ハッカーは、コードからソルトを取得する必要があるかのように、コードからキーを取得するだけでソルトを復号化できるためです。 。
ほとんどのハッシュ関数には十分な エントロピー があり、どのハッシュ関数が使用されたかを文字列で分析することはできません。ただし、異なるハッシュには異なる量と種類の文字が含まれていることが視覚的にわかります。これにより、どのハッシュが使用されているかがわかりやすくなります。
ハッカーがデータベースを入手した場合でも、コードを入手するのは簡単です。ソルトの目的は、レインボーテーブルの攻撃を受けないようにすることです。ただし、もちろん、レインボーテーブルを生成することはできますが、生成に時間がかかりすぎる場合があります。