1. ホーム

[解決済み】パスワードの「二重ハッシュ化」は、一度だけハッシュ化するよりも安全性が低いのでしょうか?

2022-03-28 09:47:01

質問

パスワードを2回ハッシュ化して保存することは、1回ハッシュ化することと比べて安全性が高いのでしょうか、低いのでしょうか?

私が言っているのは、こうすることです。

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

ではなく、これだけです。

$hashed_password = hash($plaintext_password);

もし安全性が低いのであれば、良い説明(またはそのリンク)をお願いします。

また、使用するハッシュ関数に違いはあるのでしょうか? 同じハッシュ関数を繰り返すのではなく、md5とsha1を混ぜる(例えば)と何か違いがあるのでしょうか?

注1:「ダブルハッシュ」とは、パスワードをよりわかりにくくするために2回ハッシュ化することです。 これは コリジョンを解決するためのテクニック .

注2:本当に安全なものにするためには、ランダムなソルトを加える必要があることは分かっています。 問題は、同じアルゴリズムで2回ハッシュすることが、ハッシュを助けるのか、それとも損ねるのか、ということです。

どのように解決するのですか?

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

いいえ、複数のハッシュが安全でないのではなく、安全なパスワードの使用には不可欠な要素なのです。

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

単純な繰り返しでは不十分

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

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

パスワードの解読方法

保存されたパスワードは、オフライン攻撃からの保護が必要です。パスワードが塩漬けされていない場合、事前に計算された辞書攻撃(たとえば、レインボーテーブルを使用する)で破ることができます。そうでない場合、攻撃者は各パスワードのハッシュを計算し、それが保存されているハッシュと一致するかどうかを確認するために時間を費やさなければなりません。

すべてのパスワードの可能性が同じというわけではありません。攻撃者は、短いパスワードをすべて網羅的に検索するかもしれませんが、文字数が増えるごとにブルートフォース成功の可能性が急激に低下することを知っています。その代わりに、最も可能性の高いパスワードを順番に並べたリストを使用します。パスワード123"から始まり、使用頻度の低いパスワードに進んでいきます。

攻撃者のリストが長く、100億の候補があるとします。また、デスクトップシステムが1秒間に100万回のハッシュ計算が可能だとします。攻撃者は、1回の反復処理だけであれば、3時間以内にリスト全体をテストすることができます。しかし、2,000回繰り返すとなると、その時間は約8カ月にも及ぶ。例えば、GPUの能力を活用するプログラムをダウンロードできるような、より高度な攻撃者に対抗するには、より多くの反復計算が必要です。

どのくらいあればいいの?

使用する反復回数は、セキュリティとユーザーエクスペリエンスのトレードオフの関係にあります。攻撃者が使用できる特殊なハードウェアは安価ですが それでも、1秒間に数億回の反復処理を行うことができます。 の性能は 攻撃者の システムは、何回か繰り返されたパスワードの解読にかかる時間を決定します。しかし、あなたのアプリケーションでは、このような特殊なハードウェアを使用することはないでしょう。ユーザーをイライラさせることなく何回反復できるかどうかは あなたの システムです。

認証時にユーザーを3/4秒程度余分に待たせることができるだろう。ターゲットプラットフォームのプロファイルを作成し、余裕のある限り多くのイテレーションを使用します。私がテストしたプラットフォーム(モバイルデバイスの1ユーザーまたはサーバープラットフォームの多数のユーザー)は、快適にサポートできます。 PBKDF2 を60,000回から120,000回繰り返す、または bcrypt コストファクターが12または13の場合。

その他の背景

ハッシュにおけるソルトとイタレーションの役割に関する権威ある情報についてはPKCS #5をお読みください。PBKDF2 はパスワードから暗号鍵を生成するためのものですが、パスワード認証のための一方向ハッシュとしてもうまく機能します。bcryptの各反復はSHA-2ハッシュより高価なので、より少ない反復で済むが、考え方は同じである。Bcryptはまた、多くのPBKDF2ベースのソリューションの一歩先を行き、導き出された鍵を使ってよく知られた平文を暗号化することができます。結果として得られる暗号文は、いくつかのメタデータとともにquot;hash,"として保存されます。しかし、PBKDF2で同じことをするのを止めるものは何もない。

このテーマで書いた他の回答はこちらです。