この質問に対する現在のトップ投票は次のように述べています。
もう 1 つの問題は、セキュリティに関連するものではありますが、パスワードのハッシュ化と暗号化の違いを完全に理解できていないことです。プログラマーが安全でない「パスワードを通知する」機能を提供しようとしているコードで最もよく見られます。
この違いは一体何なのでしょうか?ハッシングは暗号化の一形態であるという印象を常に持っていました。投稿者が言及している危険な機能は何ですか?
この質問に対する現在のトップ投票は次のように述べています。
もう 1 つの問題は、セキュリティに関連するものではありますが、パスワードのハッシュ化と暗号化の違いを完全に理解できていないことです。プログラマーが安全でない「パスワードを通知する」機能を提供しようとしているコードで最もよく見られます。
この違いは一体何なのでしょうか?ハッシングは暗号化の一形態であるという印象を常に持っていました。投稿者が言及している危険な機能は何ですか?
ハッシュは一方向関数です (まあ、マッピングです)。これは元に戻すことができず、安全なハッシュ アルゴリズムを適用すると、元の文字列を取り戻すことはできません。できることは、いわゆる「衝突」を生成すること、つまり、同じハッシュを提供する別の文字列を見つけることです。暗号的に安全なハッシュ アルゴリズムは、衝突の発生を防ぐように設計されています。ハッシュを保存する前にソルトを適用することで対抗できるレインボー テーブルを使用して、安全なハッシュを攻撃できます。
暗号化は適切な (双方向) 機能です。可逆的です。キーがあれば、マングルされた文字列を復号化して元の文字列を取得できます。
それが言及している安全でない機能とは、パスワードを暗号化すると、アプリケーションのキーがどこかに保存され、攻撃者がデータベース (および/またはコード) にアクセスして、キーと暗号化されたテキストの両方を取得することで元のパスワードを取得できることです。 、一方、ハッシュでは不可能です。
通常、クラッカーがあなたのデータベースやコードを所有している場合、パスワードは必要ないと言うので、その違いは意味がありません。ユーザーのパスワードを保護する義務が依然としてあるため、これはナイーブです。主な理由は、ほとんどのユーザーが同じパスワードを何度も使用し、パスワードを漏らして大きなリスクにさらしているためです。
ハッシュは一方向関数です。つまり、パスワードをハッシュすると、ハッシュから元のパスワードを取得することは非常に困難になります。暗号化は双方向の機能であり、暗号化されたテキストから元のテキストを取得する方がはるかに簡単です。
単純なハッシュは、攻撃者が辞書内のすべての単語 (または特定の長さまでの文字のすべての組み合わせ) を事前にハッシュし、この新しい辞書を使用してハッシュ化されたパスワードを検索する辞書攻撃を使用して簡単に破ることができます。保存されているハッシュ化されたパスワードごとに一意のランダム ソルトを使用すると、攻撃者がこの方法を使用することがはるかに困難になります。基本的に、使用するソルト値ごとに新しい一意の辞書を作成する必要があり、攻撃が大幅に遅くなります。
暗号化アルゴリズムを使用してパスワードを保存することは安全ではありません。ユーザーまたは管理者が暗号化されたテキストから元のパスワードを取得する方が簡単な場合は、攻撃者が同じことを行うのも容易になるからです。
上の画像に示すように、パスワードが暗号化されている場合、それは常に、誰かが平文のパスワードを抽出できる秘密の秘密です。ただし、パスワードがハッシュ化されている場合、ハッシュ値からパスワードを復元する方法はほとんどないため、安心できます。
暗号化されたパスワードとハッシュされたパスワードからの抽出- どちらが優れていますか?
プレーン テキストのパスワードは、DES、AES などの対称暗号化アルゴリズムまたはその他のアルゴリズムを使用して暗号化し、データベース内に保存できます。認証 (ユーザー名とパスワードによる身元の確認) では、アプリケーションはデータベースに保存されている暗号化されたパスワードを復号化し、ユーザーが提供したパスワードと等しいかどうかを比較します。このタイプのパスワード処理アプローチでは、誰かがデータベース テーブルにアクセスしたとしても、パスワードを簡単に再利用できるわけではありません。ただし、このアプローチにも悪いニュースがあります。なんらかの方法で誰かがアプリケーションで使用されるキーと共に暗号化アルゴリズムを取得すると、データベースに保存されているすべてのユーザー パスワードを復号化して表示できます。「これは私が得た最良の選択肢です」とソフトウェア開発者は叫ぶかもしれませんが、もっと良い方法はありますか?
はい、ここで要点を見逃しているかもしれません。復号化して比較する必要がないことに気付きましたか? パスワードを変換された単語に変換できる一方向のみの変換アプローチがある場合、逆の操作 (変換された単語からパスワードを生成する) は不可能です。現在、誰かがデータベースにアクセスしたとしても、変換された単語を使用してパスワードを再現または抽出する方法はありません。このアプローチでは、ユーザーの極秘パスワードを誰かが知る可能性はほとんどありません。これにより、複数のアプリケーションで同じパスワードを使用するユーザーが保護されます。このアプローチにはどのようなアルゴリズムを使用できますか?
私は常に、暗号化は両方の方法で変換できると考えてきました。つまり、最終値が元の値に戻り、ハッシングを使用すると、最終結果から元の値に戻すことができなくなります。
ハッシュ アルゴリズムは通常、本質的に暗号化されていますが、主な違いは、暗号化は復号化によって元に戻すことができ、ハッシュは元に戻せないことです。
暗号化関数は、通常、入力を受け取り、同じサイズまたはわずかに大きいサイズの暗号化された出力を生成します。
ハッシュ関数は入力を受け取り、通常は固定サイズのより小さな出力を生成します。
ハッシュされた結果を取得して「デハッシュ」して元の入力を取り戻すことはできませんが、通常、同じハッシュを生成する方法をブルートフォースすることができます。
言い換えれば、認証スキームがパスワードを取得し、それをハッシュし、ハッシュされたバージョンの requires パスワードと比較する場合、元のパスワードを実際に知っている必要はなく、そのハッシュだけを知っている必要はなく、ブルート フォース攻撃を行うことができます。たとえそれが異なるパスワードであっても、一致するものへの道。
ハッシュ関数は通常、衝突の可能性を最小限に抑え、他のものと同じハッシュを生成するものを計算することを困難にするために作成されます。
理想的には、両方を行う必要があります。
まず、一方向セキュリティのパス パスワードをハッシュします。セキュリティを強化するためにソルトを使用します。
次に、ハッシュを暗号化して、パスワード ハッシュのデータベースが侵害された場合に辞書攻撃から防御します。
他の答えが正しいかもしれませんが、引用があった文脈では、ハッシュは情報を保護するために使用される可能性のあるツールであり、暗号化は情報を取得し、権限のない人が読み取り/使用することを非常に困難にするプロセスです.
どちらか一方を使用する理由の 1 つは、パスワードの取得です。
ユーザーのパスワードのハッシュのみを保存する場合、「パスワードを忘れた」機能を提供することはできません。