パスワードのハッシュと暗号化の違い


140

この質問に現在投票されているトップは次のように述べています:

セキュリティ関連ではありますが、それほどセキュリティの問題ではないもう1つの問題は完全であり、パスワードのハッシュと暗号化の違い理解するのに失敗しています。最も一般的に見られるのは、プログラマーが安全でない「パスワードを思い出させる」機能を提供しようとしているコードです。

この違いは正確には何ですか?ハッシュは暗号化の一種だといつも思っていました。投稿者が言及している危険な機能とは何ですか?


シークレット/パスワードを単純にハッシュしてはならない理由についてのよく書かれた記事。代わりにHMACを使用してください。benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

StackExchangeのセキュリティブログに被写体の優秀要約:security.blogoverflow.com/2011/11/...
デヴィッド・J. Liszewski

@JayKumar:あなたがリンクした記事は非常に誤解を招くものです。それは(秘密のままであることが期待される)MACキーでパスワードソルト(攻撃者に見えることが期待される)をコンフレートします。David J. Liszewskiのリンクは、はるかに正確な説明を提供します。
Rufflewind 2016年

回答:


222

ハッシュは一方向の関数(まあ、マッピング)です。元に戻すことはできません。安全なハッシュアルゴリズムを適用すると、元の文字列を元に戻すことはできません。あなたができることは、「衝突」と呼ばれるものを生成することです。つまり、同じハッシュを提供する別の文字列を見つけることです。暗号的に安全なハッシュアルゴリズムは、衝突の発生を防ぐように設計されています。レインボーテーブルを使用することで、安全なハッシュを攻撃できますレインボーテーブルは、ハッシュを保存する前にハッシュにソルトを適用することで対抗できます。

暗号化は適切な(双方向)関数です。リバーシブルです。キーがあれば、マングルされた文字列を復号化して元の文字列を取得できます。

安全ではない機能とは、パスワードを暗号化すると、アプリケーションのどこかにキーが保存され、データベース(またはコード)にアクセスする攻撃者がキーと暗号化されたテキストの両方を取得して元のパスワードを取得できるということです、ハッシュでは不可能です。

人々は通常、クラッカーがあなたのデータベースまたはあなたのコードを所有しているなら、彼はパスワードを必要としないので、その違いは疑わしいと言います。ユーザーのパスワードを保護する義務が依然としてあるため、これはナイーブです。主に、ほとんどのユーザーが同じパスワードを何度も使用しているため、ユーザーのパスワードが漏洩することにより大きなリスクにさらされているためです。


1
明確にするために、ハッシュを使用して必要なセキュリティを取得します。これは、ハッシュが不可逆であるだけでなく、同じハッシュを生成する他の文字列を生成することも計算上不可能であるという特定のプロパティを備えた暗号的に安全なハッシュアルゴリズムである必要があります。
トールジェフ

11
はい、いいえ...ハッシュ衝突は、アプリケーションのセキュリティのために生成するのが難しい必要がありますが、非可逆性はパスワードの漏洩を回避するのに十分です。
Dave Sherohman、2008年

5
絹のような:そしてあなたはお粗末なハッシュ関数から元のパスワードをどのくらい正確に取り戻すのですか?デイブのコメントを再読することをお勧めします
Vinko Vrsalovic

1
どちらかといえば、衝突の多いハッシュ関数はパスワードのセキュリティには優れていますが、それは明らかに、アカウントへのログインに使用できるパスワードが増えることを意味します。
williamvicary 2012年

1
@ n00bソルトは、ハッシュされたすべてのアイテムが個別のソルトを使用する必要があるため、ハードコーディングできません。ソルトの要点は、ユーザーAとユーザーBの両方がパスワード「1234」を使用している場合です。ユーザーAのパスワードがわかっても、ソルトが異なるため、ユーザーBが同じパスワードを使用していることはわかりません。ソルトを秘密にしておくことはセキュリティ上重要ではありません。ほとんどの実装では、ハッシュを表すバイナリBLOBの前または後ろにソルトを連結するだけです。
Scott Chamberlain

34

ハッシュは一方向の関数です。つまり、いったんパスワードをハッシュすると、元のパスワードをハッシュから戻すことは非常に困難になります。暗号化は双方向の機能であり、暗号化されたテキストから元のテキストを取得する方がはるかに簡単です。

プレーンハッシュは、辞書攻撃を使用して簡単に無効にできます。攻撃者は、辞書内のすべての単語(または特定の長さまでの文字のすべての組み合わせ)を事前にハッシュし、この新しい辞書を使用してハッシュされたパスワードを検索します。格納されたハッシュされたパスワードごとに一意のランダムソルトを使用すると、攻撃者がこの方法を使用することがはるかに困難になります。基本的に、使用するすべてのソルト値に対して新しい一意の辞書を作成する必要があり、攻撃が大幅に遅くなります。

暗号化アルゴリズムを使用してパスワードを保存するのは安全ではありません。ユーザーまたは管理者が暗号化されたテキストから元のパスワードを取得する方が簡単であれば、攻撃者も同じことをするのが簡単だからです。


12

暗号化されたパスワードとハッシュ化されたパスワード

上の画像に示すように、パスワードが暗号化されている場合、それは常に隠された秘密であり、誰かがプレーンテキストのパスワードを抽出できます。ただし、パスワードがハッシュ化されると、ハッシュ値からパスワードを回復する方法がほとんどないため、リラックスできます。


暗号化されたパスワードとハッシュ化されたパスワードから抽出-どちらが良いですか?

暗号化は良いですか?

プレーンテキストのパスワードは、DES、AESなどの対称暗号化アルゴリズムを使用して、または他のアルゴリズムを使用して暗号化し、データベース内に保存できます。認証(ユーザー名とパスワードを使用してIDを確認する)で、アプリケーションはデータベースに格納されている暗号化されたパスワードを復号化し、ユーザー提供のパスワードと比較して等しいかどうかを確認します。このタイプのパスワード処理アプローチでは、誰かがデータベーステーブルにアクセスしたとしても、パスワードを単純に再利用することはできません。ただし、このアプローチにも悪いニュースがあります。誰かがアプリケーションで使用されているキーとともに暗号化アルゴリズムを取得した場合、そのユーザーはデータベースに保存されているすべてのユーザーパスワードを復号化して表示できます。「これは私が得た最良の選択肢です」、ソフトウェア開発者は悲鳴を上げるかもしれませんが、より良い方法はありますか?

暗号化ハッシュ関数(一方向のみ)

はい、あります。ここでポイントを逃した可能性があります。復号化して比較する必要がないことに気づきましたか?パスワードをいくつかの変換された単語に変換できる一方向のみの変換アプローチがあるが、逆の操作(変換された単語からのパスワードの生成)が不可能である場合。誰かがデータベースにアクセスしたとしても、変換された単語を使用してパスワードを再現または抽出する方法はありません。このアプローチでは、ユーザーのトップシークレットパスワードを知っている人はほとんどいないでしょう。これにより、複数のアプリケーションで同じパスワードを使用するユーザーが保護されます。このアプローチにはどのアルゴリズムを使用できますか?


わかりましたが、サービスにログインすると、パスワードはプレーンテキスト/暗号化されて送信されます。これは、比較するためにハッシュとしてサーバーに送信されるためです。ハッカーがハッシュを知っている場合は、ハッシュをサーバーに送信してログインすることができます。これが、比較用のパスワードを暗号化してサーバーに送信する必要がある理由です。これは安全ですか?パスワードがハッシュ化されていない形式で長期間保存されることがなく、暗号化/プレーンテキストパスワードのすべての発生が不要になったときにメモリから消去されますか?
AgentM

8

暗号化は両方の方法で変換できると常に思っていました。つまり、最終値によって元の値に戻すことができ、ハッシュを使用すると、最終結果から元の値に戻すことができなくなります。


8

ハッシュアルゴリズムは通常暗号化されていますが、主な違いは、暗号化は復号化によって元に戻すことができ、ハッシュはそうではないことです。

暗号化関数は、通常、入力を受け取り、同じサイズまたはわずかに大きいサイズの暗号化された出力を生成します。

ハッシュ関数は入力を受け取り、通常は固定サイズの通常より小さな出力を生成します。

ハッシュされた結果を取得して「デハッシュ」して元の入力に戻すことはできませんが、通常、同じハッシュを生成するものに総当たりすることができます。

言い換えると、認証スキームがパスワードを取得し、ハッシュして、それをrequireパスワードのハッシュバージョンと比較する場合、元のパスワードを実際に知っている必要はなく、そのハッシュのみであり、ブルートフォースが可能です。別のパスワードであっても、一致するものへの道。

ハッシュ関数は、通常、衝突の可能性を最小限に抑え、他のものと同じハッシュを生成するものを単に計算することを難しくするために作成されます。


4

理想的には両方を行う必要があります。

まず、一方向のセキュリティのためにパスパスワードをハッシュします。セキュリティを強化するには、塩を使用します。

次に、パスワードハッシュのデータベースが危険にさらされている場合に、ハッシュを暗号化して辞書攻撃から保護します。


3
何で暗号化しますか?彼らがあなたを激しく攻撃したので、すべてのユーザーのパスワード(ハッシュ化、暗号化など)を使用してデータベースにアクセスした場合、それらを解読するためのキーを見つけることができませんか?
Luc

5
これは反対投票すべきではありません。アプリケーションが侵害されていないのにデータベースが危険にさらされている可能性は、それほど容易に除外されるべきではありません。したがって、ハッシュの暗号化はセキュリティの追加レイヤーです。
Arie

@Luc私はあなた、私の以前の自分に同意しません。アプリケーションコード(または構成ファイル)を損なうことのないSQLインジェクションが多すぎるのを見てきましたが、シークレットを追加することは、それが暗号化の形式であれ、コショウの形式であれ、役立つと私は考えています。ただし、ハッシュを置き換えることはできませ。より完全な回答については、こちらをご覧ください:security.stackexchange.com/a/31846/10863
Luc

3

ハッシュ

これは一方向のアルゴリズムであり、いったんハッシュされるとロールバックできません。これが暗号化に対するスイートポイントです。

暗号化

暗号化を実行する場合、これを行うためのキーがあります。このキーが漏洩すると、すべてのパスワードが簡単に解読される可能性があります。

一方、データベースがハッキングされる場合や、サーバー管理者がDBからデータを取得してハッシュ化されたパスワードを使用した場合でも、ハッカーはこれらのハッシュ化されたパスワードを解読することはできません。適切なソルトを使用したハッシュとPBKDF2による追加のセキュリティを使用する場合、これは実際には不可能です。

ハッシュ関数をどのように記述するかを確認したい場合は、こちらにアクセスしてください

ハッシュを実行する多くのアルゴリズムがあります。

  1. MD5 -Message Digest Algorithm 5(MD5)ハッシュ関数を使用します。出力ハッシュの長さは128ビットです。MD5アルゴリズムは、Ron Rivestによって1990年代初頭に設計されたものであり、今日では推奨されないオプションです。

  2. SHA1-1995年に公開されたセキュリティハッシュアルゴリズム(SHA1)ハッシュを使用します。出力ハッシュの長さは160ビットです。最も広く使用されていますが、これは今日の推奨オプションではありません。

  3. HMACSHA256HMACSHA384HMACSHA512 -SHA-2ファミリーの関数SHA-256、SHA-384、およびSHA-512を使用します。SHA-2は2001年に公開されました。ハッシュ関数の名前が示すように、出力されるハッシュの長さはそれぞれ256、384、512ビットです。


1

他の回答と同じように、引用があったコンテキストでは、ハッシュは情報を保護するために使用できるツールです。暗号化は情報を取得するプロセスであり、権限のない人が読み取り/使用することを非常に困難にします。


-9

ここで、パスワードの取得という1つの理由をもう1つ使用する場合があります。

ユーザーのパスワードのハッシュのみを保存する場合、「パスワードを忘れた」機能を提供することはできません。


16
あなたは明らかに受け入れられた答えを十分に読んでいませんでした。注意深く読んでください:パスワード取得機能を提供することは想定されていません。あなたはパスワードリセット機能を提供することになっています。私は長年にわたり、vBulletin、phpBB、e107、IPB、ブログスポット、さらには自分で作成した独自のCMSを含む多くのWebサイトを管理してきました。管理者は、誰かのハッシュ化されたパスワードを決して持つ必要はありません。あなたはしません。そして、あなたもそれを持っているべきではありません。あなたが私が言っていることに同意しない場合は、私にあなたに保証させてください:あなたは間違っています。
レイキー2013年

3
怒りすぎてすみません。パスワードをプレーンテキストで保存しているWebサイトが多すぎて、イライラします。余談ですが、セキュリティを重視するWebサイトでは、ユーザーに定期的にパスワードを変更させたい場合があります。彼らは、その人が自分のパスワードを「Password1」から「Password2」に変更しないようにしたいと考えています。したがって、これらの比較を後で行うために、プレーンテキストのパスワードを保持します。それは良い習慣ではありません。その場合、彼らがする必要があるのは、最初にパスワードの分析を実行し、類似したパスワードの束を作成し(それぞれをハッシュし)ハッシュのみを保存することです。
Lakey

7
問題ありません。質問に戻ってもう一度読み直し、さらに調査を行ったので、すべてが失われることはありませんでした:-)その答えを書いたときに何を考えていたかはわかりません。歓声
Philtron 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.