「二重ハッシュ」パスワードは、一度ハッシュするパスワードよりも安全性が低くなりますか? 質問する

「二重ハッシュ」パスワードは、一度ハッシュするパスワードよりも安全性が低くなりますか? 質問する

保存前にパスワードを 2 回ハッシュすると、1 回だけハッシュするよりも安全性が高まりますか、低くなりますか?

私が言っているのは、次のことです:

$hashed_password = hash(hash($plaintext_password));

次のように書くのではなく:

$hashed_password = hash($plaintext_password);

安全性が低い場合は、適切な説明(または説明へのリンク)を提供できますか?

また、使用するハッシュ関数によって違いは生じますか? 同じハッシュ関数を繰り返すのではなく、たとえば md5 と sha1 を混在させると、何か違いが生じますか?

注1: ​​「ダブルハッシュ」とは、パスワードを2度ハッシュしてより難読化することを指します。衝突を解決する技術

注 2: 本当に安全にするにはランダム ソルトを追加する必要があることはわかっています。問題は、同じアルゴリズムで 2 回ハッシュするとハッシュに効果があるか、それとも害があるかということです。

ベストアンサー1

パスワードを一度ハッシュするのは安全ではない

いいえ、複数のハッシュは安全性が低いわけではありません。安全なパスワードの使用に不可欠な要素です。

ハッシュを反復すると、攻撃者が候補リスト内の各パスワードを試すのにかかる時間が長くなります。パスワード攻撃にかかる時間を数時間から数年に簡単に増やすことができます。

単純な反復だけでは不十分

ハッシュ出力を入力に連鎖させるだけでは、セキュリティには不十分です。反復は、パスワードのエントロピーを維持するアルゴリズムのコンテキストで実行する必要があります。幸いなことに、設計に信頼性を与えるのに十分な精査を受けた公開されたアルゴリズムがいくつかあります。

PBKDF2 のような優れたキー導出アルゴリズムは、ハッシュの各ラウンドにパスワードを挿入し、ハッシュ出力の衝突に関する懸念を軽減します。PBKDF2 は、そのままパスワード認証に使用できます。Bcrypt は、キー導出の後に暗号化ステップを実行します。このため、キー導出を逆行する高速な方法が発見された場合でも、攻撃者は既知平文攻撃を実行する必要があります。

パスワードを破る方法

保存されたパスワードは、オフライン攻撃から保護する必要があります。パスワードにソルトが付いていないと、事前に計算された辞書攻撃 (たとえば、レインボー テーブルを使用) によってパスワードが破られる可能性があります。ソルトが付いていないと、攻撃者は各パスワードのハッシュを計算し、保存されたハッシュと一致するかどうかを確認するために時間を費やす必要があります。

すべてのパスワードが同じようにあり得るわけではありません。攻撃者はすべての短いパスワードを徹底的に検索するかもしれませんが、文字を追加するごとにブルートフォース攻撃の成功率が急激に低下することを知っています。代わりに、攻撃者は最もあり得るパスワードの順序付きリストを使用します。「password123」から始めて、あまり使用されていないパスワードに進みます。

攻撃者のリストが長く、100 億の候補があるとします。また、デスクトップ システムは 1 秒あたり 100 万のハッシュを計算できるとします。攻撃者は、1 回の反復だけを使用する場合、リスト全体を 3 時間未満でテストできます。ただし、2000 回の反復を使用する場合、その時間はほぼ 8 か月に延長されます。より高度な攻撃者 (たとえば、GPU のパワーを利用できるプログラムをダウンロードできる攻撃者) を倒すには、より多くの反復が必要です。

どれくらいあれば十分でしょうか?

使用する反復回数は、セキュリティとユーザーエクスペリエンスのトレードオフです。攻撃者が使用できる特殊なハードウェアは安価ですが、それでも、1 秒あたり数億回の反復処理を実行できます。攻撃者のシステムのパフォーマンスによって、反復回数に応じてパスワードを破るのにかかる時間が決まります。ただし、アプリケーションがこの特殊なハードウェアを使用する可能性は低いです。ユーザーを煩わせることなく反復を何回実行できるかは、システムによって異なります

認証中にユーザーがさらに3/4秒ほど待たされる可能性もあるでしょう。ターゲットプラットフォームをプロファイルし、可能な限り多くの反復処理を実行してください。私がテストしたプラットフォーム(モバイルデバイス上の1人のユーザー、またはサーバープラットフォーム上の多数のユーザー)は、快適にサポートできます。PBKDF260,000回から120,000回の反復、または暗号コスト係数は 12 または 13 です。

背景情報

ハッシュにおけるソルトと反復処理の役割に関する信頼できる情報については、PKCS #5 を参照してください。PBKDF2 はパスワードから暗号化キーを生成するためのものですが、パスワード認証用の一方向ハッシュとしてもうまく機能します。bcrypt の各反復処理は SHA-2 ハッシュよりもコストがかかるため、反復処理の数を減らすことができますが、考え方は同じです。また、bcrypt は、派生キーを使用して既知のプレーン テキストを暗号化することで、ほとんどの PBKDF2 ベースのソリューションよりも一歩進んでいます。結果として得られる暗号テキストは、メタデータとともに「ハッシュ」として保存されます。ただし、PBKDF2 でも同じことを行うことができます。

このトピックに関して私が書いた他の回答は次のとおりです。

おすすめ記事