この質問に現在投票されているトップは次のように述べています:
セキュリティ関連ではありますが、それほどセキュリティの問題ではないもう1つの問題は完全であり、パスワードのハッシュと暗号化の違いを理解するのに失敗しています。最も一般的に見られるのは、プログラマーが安全でない「パスワードを思い出させる」機能を提供しようとしているコードです。
この違いは正確には何ですか?ハッシュは暗号化の一種だといつも思っていました。投稿者が言及している危険な機能とは何ですか?
この質問に現在投票されているトップは次のように述べています:
セキュリティ関連ではありますが、それほどセキュリティの問題ではないもう1つの問題は完全であり、パスワードのハッシュと暗号化の違いを理解するのに失敗しています。最も一般的に見られるのは、プログラマーが安全でない「パスワードを思い出させる」機能を提供しようとしているコードです。
この違いは正確には何ですか?ハッシュは暗号化の一種だといつも思っていました。投稿者が言及している危険な機能とは何ですか?
回答:
ハッシュは一方向の関数(まあ、マッピング)です。元に戻すことはできません。安全なハッシュアルゴリズムを適用すると、元の文字列を元に戻すことはできません。あなたができることは、「衝突」と呼ばれるものを生成することです。つまり、同じハッシュを提供する別の文字列を見つけることです。暗号的に安全なハッシュアルゴリズムは、衝突の発生を防ぐように設計されています。レインボーテーブルを使用することで、安全なハッシュを攻撃できます。レインボーテーブルは、ハッシュを保存する前にハッシュにソルトを適用することで対抗できます。
暗号化は適切な(双方向)関数です。リバーシブルです。キーがあれば、マングルされた文字列を復号化して元の文字列を取得できます。
安全ではない機能とは、パスワードを暗号化すると、アプリケーションのどこかにキーが保存され、データベース(またはコード)にアクセスする攻撃者がキーと暗号化されたテキストの両方を取得して元のパスワードを取得できるということです、ハッシュでは不可能です。
人々は通常、クラッカーがあなたのデータベースまたはあなたのコードを所有しているなら、彼はパスワードを必要としないので、その違いは疑わしいと言います。ユーザーのパスワードを保護する義務が依然としてあるため、これはナイーブです。主に、ほとんどのユーザーが同じパスワードを何度も使用しているため、ユーザーのパスワードが漏洩することにより大きなリスクにさらされているためです。
ハッシュは一方向の関数です。つまり、いったんパスワードをハッシュすると、元のパスワードをハッシュから戻すことは非常に困難になります。暗号化は双方向の機能であり、暗号化されたテキストから元のテキストを取得する方がはるかに簡単です。
プレーンハッシュは、辞書攻撃を使用して簡単に無効にできます。攻撃者は、辞書内のすべての単語(または特定の長さまでの文字のすべての組み合わせ)を事前にハッシュし、この新しい辞書を使用してハッシュされたパスワードを検索します。格納されたハッシュされたパスワードごとに一意のランダムソルトを使用すると、攻撃者がこの方法を使用することがはるかに困難になります。基本的に、使用するすべてのソルト値に対して新しい一意の辞書を作成する必要があり、攻撃が大幅に遅くなります。
暗号化アルゴリズムを使用してパスワードを保存するのは安全ではありません。ユーザーまたは管理者が暗号化されたテキストから元のパスワードを取得する方が簡単であれば、攻撃者も同じことをするのが簡単だからです。
上の画像に示すように、パスワードが暗号化されている場合、それは常に隠された秘密であり、誰かがプレーンテキストのパスワードを抽出できます。ただし、パスワードがハッシュ化されると、ハッシュ値からパスワードを回復する方法がほとんどないため、リラックスできます。
暗号化されたパスワードとハッシュ化されたパスワードから抽出-どちらが良いですか?
プレーンテキストのパスワードは、DES、AESなどの対称暗号化アルゴリズムを使用して、または他のアルゴリズムを使用して暗号化し、データベース内に保存できます。認証(ユーザー名とパスワードを使用してIDを確認する)で、アプリケーションはデータベースに格納されている暗号化されたパスワードを復号化し、ユーザー提供のパスワードと比較して等しいかどうかを確認します。このタイプのパスワード処理アプローチでは、誰かがデータベーステーブルにアクセスしたとしても、パスワードを単純に再利用することはできません。ただし、このアプローチにも悪いニュースがあります。誰かがアプリケーションで使用されているキーとともに暗号化アルゴリズムを取得した場合、そのユーザーはデータベースに保存されているすべてのユーザーパスワードを復号化して表示できます。「これは私が得た最良の選択肢です」、ソフトウェア開発者は悲鳴を上げるかもしれませんが、より良い方法はありますか?
はい、あります。ここでポイントを逃した可能性があります。復号化して比較する必要がないことに気づきましたか?パスワードをいくつかの変換された単語に変換できる一方向のみの変換アプローチがあるが、逆の操作(変換された単語からのパスワードの生成)が不可能である場合。誰かがデータベースにアクセスしたとしても、変換された単語を使用してパスワードを再現または抽出する方法はありません。このアプローチでは、ユーザーのトップシークレットパスワードを知っている人はほとんどいないでしょう。これにより、複数のアプリケーションで同じパスワードを使用するユーザーが保護されます。このアプローチにはどのアルゴリズムを使用できますか?
暗号化は両方の方法で変換できると常に思っていました。つまり、最終値によって元の値に戻すことができ、ハッシュを使用すると、最終結果から元の値に戻すことができなくなります。
ハッシュアルゴリズムは通常暗号化されていますが、主な違いは、暗号化は復号化によって元に戻すことができ、ハッシュはそうではないことです。
暗号化関数は、通常、入力を受け取り、同じサイズまたはわずかに大きいサイズの暗号化された出力を生成します。
ハッシュ関数は入力を受け取り、通常は固定サイズの通常より小さな出力を生成します。
ハッシュされた結果を取得して「デハッシュ」して元の入力に戻すことはできませんが、通常、同じハッシュを生成するものに総当たりすることができます。
言い換えると、認証スキームがパスワードを取得し、ハッシュして、それをrequireパスワードのハッシュバージョンと比較する場合、元のパスワードを実際に知っている必要はなく、そのハッシュのみであり、ブルートフォースが可能です。別のパスワードであっても、一致するものへの道。
ハッシュ関数は、通常、衝突の可能性を最小限に抑え、他のものと同じハッシュを生成するものを単に計算することを難しくするために作成されます。
理想的には両方を行う必要があります。
まず、一方向のセキュリティのためにパスパスワードをハッシュします。セキュリティを強化するには、塩を使用します。
次に、パスワードハッシュのデータベースが危険にさらされている場合に、ハッシュを暗号化して辞書攻撃から保護します。
ハッシュ:
これは一方向のアルゴリズムであり、いったんハッシュされるとロールバックできません。これが暗号化に対するスイートポイントです。
暗号化
暗号化を実行する場合、これを行うためのキーがあります。このキーが漏洩すると、すべてのパスワードが簡単に解読される可能性があります。
一方、データベースがハッキングされる場合や、サーバー管理者がDBからデータを取得してハッシュ化されたパスワードを使用した場合でも、ハッカーはこれらのハッシュ化されたパスワードを解読することはできません。適切なソルトを使用したハッシュとPBKDF2による追加のセキュリティを使用する場合、これは実際には不可能です。
ハッシュ関数をどのように記述するかを確認したい場合は、こちらにアクセスしてください。
ハッシュを実行する多くのアルゴリズムがあります。
MD5 -Message Digest Algorithm 5(MD5)ハッシュ関数を使用します。出力ハッシュの長さは128ビットです。MD5アルゴリズムは、Ron Rivestによって1990年代初頭に設計されたものであり、今日では推奨されないオプションです。
SHA1-1995年に公開されたセキュリティハッシュアルゴリズム(SHA1)ハッシュを使用します。出力ハッシュの長さは160ビットです。最も広く使用されていますが、これは今日の推奨オプションではありません。
HMACSHA256、HMACSHA384、HMACSHA512 -SHA-2ファミリーの関数SHA-256、SHA-384、およびSHA-512を使用します。SHA-2は2001年に公開されました。ハッシュ関数の名前が示すように、出力されるハッシュの長さはそれぞれ256、384、512ビットです。
ここで、パスワードの取得という1つの理由をもう1つ使用する場合があります。
ユーザーのパスワードのハッシュのみを保存する場合、「パスワードを忘れた」機能を提供することはできません。