ハッシュを特殊なハードウェアでターゲットにすることを困難にするために、私は直感的に、一連の異なるハッシュアルゴリズムを混在させることでさらに強力になるはずだと思います。簡単にするために、_Hash1
_は_SHA256
_の反復数であり、_Hash2
_はbcrypt
であり、_Hash3
_はscrypt
であると仮定します。
_myhash = Hash1(Hash2(Hash3(0, password, salt), password, salt), password, salt)
_
_Hash1
_、_Hash2
_、および_Hash3
_をそれぞれ一般的なユーザーのハードウェアで計算するのに1/3秒かかるとすると、なぜ
_myhash = Hash1(Hash1(Hash1(0, password, salt), password, salt), password, salt)
_
編集:短い形式Hash1(Hash1(Hash1(password ^ salt)))
をより正確な形式Hash1(Hash1(Hash1(0, password, salt), password, salt), password, salt)
に変更し、以前の形式との衝突の量が多いことのみを指摘する回答を回避しました。 myhash
の残りのエントロピー(xが0に近いため、衝突による〜256-x)がユーザーのパスワードのエントロピーよりもかなり高い限り、衝突はユーザーパスワードハッシュの重要な要素ではありません。ユーザーのパスワードは、パスワードジェネレーターによって選択されない限り、ほとんど常に60ビット未満のエントロピーを持っています。
私のコメントを答えにするように頼まれたので、ここに行きます。
基本的に、bcrypt、scrypt、pbkdf2はハッシュそのものではなく、KDF(鍵導出関数)であると述べました。 KDFはHMACアルゴリズムに基づいて構築されています。HMACアルゴリズムは、SHA-256のような一方向ハッシュアルゴリズムに基づいて構築され、メッセージダイジェスト値を生成します。
KDFから価値を引き出すには、すでにかなりの混合、攪拌、および揺れが関係しています。
複数のKDFの出力を混在させても全体的なセキュリティが低下しない場合でも、実質的には改善されない可能性があります。
ハッシュパスワード を試行する場合、攻撃者は常に防御側と同じ種類のハードウェアを使用できます。攻撃者が試みることは、攻撃者が潜在的なパスワードをハッシュ[〜#〜] n [〜#〜]することを可能にする特殊なハードウェアを使用することにより、より良いことを行うことです。彼は防御側のハードウェアを使用していた。 総コストには、ハードウェアの購入コスト、関連ソフトウェアの開発コスト、ハードウェアの実行コストが含まれます。使用電力に相当します(ハードウェアへの電力供給とハードウェアの冷却用)。深刻な攻撃者にとっては、電力コストが支配的です。
攻撃者が防御側よりも安くできる操作がある場合は常に、攻撃側が勝利します。重要な点は、パスワードの解読は 恥ずかしいほど並列 の問題であるということです。定義により、攻撃者は多くの潜在的なパスワードを試すことができます。
3つの異なるハッシュ関数Hash1
、Hash2
、およびHash3
をカスケードするとします。つまり、防御側は3つの実装をすべて手元に用意し、すべて自分のサーバーで実行する必要があります。一方、攻撃者はより良いスケジュールを立てることができます。たとえば、100万個の潜在的なパスワードをHash1
でハッシュし、結果をバッファに保存できます。次に、ハードウェアをHash2
を適用するものに切り替え、前のステップから100万保存された出力を超えて実行し、再度Hash2
出力をいくつかのバッファーに保存します。最後に、Hash3
を使用して、ハードウェアを再び切り替えます。
この種類の「ハードウェアスイッチング」は、特に [〜#〜] fpga [〜#〜] を使用する場合に関連します。各「スイッチング」は同じ実際のハードウェアの再プログラミングであり、せいぜい数秒。そのようなスケジューリングとバッファリングを使用することにより、「スイッチング」コストは無視できます。
これはパイプライン処理としても使用できます。攻撃者が3つの専用マシンを構築した場合、1つはHash1
、1つはHash2
、もう1つはHash3
、次に、最初の潜在的なパスワードに対してHash1
を実行し、Hash2
を計算するマシンに出力を送信できます。 2番目のマシンはHash2
を計算しますが、最初のマシンはHash1
を別の潜在的なパスワードに基づいて計算できます。等々。実際には、攻撃者は自分の専用マシンをいつでもフル稼働状態に維持できるため、「増加した強さ」でのあなたの試みを笑うことができます。
さらに、実装する3つの異なるハッシュ関数があり、そのうちの1つだけを特殊なハードウェアで最適化できる場合でも、攻撃者はそのハッシュ関数を最適化することで勝利します。大雑把に言うと、bcrypt、scrypt、SHA-256をカスケード接続すると、攻撃者は最初の2つにはPCを使用し、SHA-256にはGPUを使用するため、約3分の1のコストを回避できます。
要約すると、「一連の異なるハッシュアルゴリズムを混在させると強度が向上する」という直感は間違っています。それは反対です。このような混在は、防御者の開発および使用コストを増加させますが、攻撃者(多くの並列処理を利用する)を遅くすることはなく、最適化のための攻撃者のオプションを増やします。
(これはすべて、カスケードされたすべての機能の個々のソルトの管理や自家製の暗号化の危険性など、実際的なことを検討することなく語られます。)
コピーするには progs.SEの同様の質問に対する私の答え:
の問題
hash1(hash2(hash3(...hashn(pass+salt)+salt)+salt)...)+salt)
これは、チェーン内の最も弱いハッシュ関数と同じくらい強いということです。たとえば、hashn(最も内側のハッシュ)が衝突した場合、ハッシュチェーン全体が衝突します(チェーン内の他のハッシュに関係なく)
より強い鎖は
hash1(hash2(hash3(...hashn(pass+salt)+pass+salt)+pass+salt)...)+pass+salt)
ここでは、早期衝突の問題を回避し、最終的なハッシュのパスワードに依存するソルトを本質的に生成します
チェーンの1つのステップが衝突しても問題はありません。次のステップでパスワードが再度使用され、パスワードごとに異なる結果が得られるためです。
異なるハッシュアルゴリズムを使用しても、エントロピーが増えることはなく、むしろ少なくなります。 「安全は最弱点よりも強くない」という表現を聞いたことがあると思いますが、ここでも同じことが言えます。このエントロピーは、最も弱いアルゴリズムが提供するものを超えることはありません。
ただし、同じアルゴリズムでパスワードを複数回ハッシュすると、セキュリティが強化されます。ただし、弱いアルゴリズムを多数回使用するのではなく、強力なハッシュアルゴリズムを数回使用します。より安全な例:
sha512 ( sha512 ( sha512 ( password + salt )))
より:
sha1 ( sha1 ( sha1 ( sha1 ( sha1 ( sha1 ( ... sha1 ( password + salt ) ... ))))))
これを信じないで、私にそれを証明して欲しい人がいるのがわかります。例を挙げましょう。私は3つのハッシュアルゴリズム、SHA256、SHA1、MD5を選択しました。
だから私たちが持っている場合:
sha256 ( sha1 ( md5 ( password + salt )));
最初に、パスワードとソルトがMD5でハッシュされます。出力は128ビットになるため、MD5出力の可能性の合計は2 ^ 128です。次に、MD5サムはSHA1でハッシュされますが、すべての可能性をハッシュする必要はなく、MD5出力として2 ^ 128のみをハッシュします。次に、SHA1の合計がSHA256でハッシュされますが、これも同じです。 SHA256のすべての可能性をハッシュする必要はなく、MD5が生成する2 ^ 128の可能性のみをハッシュ化する必要があります。したがって、このハッシュアルゴリズムは、MD5のように、エントロピーが2 ^ 128の出力しか生成できません。また、MD5には複数の脆弱性があるため、実際の強度は2 ^ 128未満です。
通常、ハッシュを混在させると、チェーン内の最も弱いハッシュのセキュリティが確保されます。
ハッシュを混合するのではなく、CPU能力は通常、より多くのバイトでハッシュすることに向けられます。
つまり、2つのアルゴリズムを使用したハッシュにNジュールの作業が必要で、セキュリティが低下する場合は、SHA256の代わりにSHA512を使用するだけで、より安全になります。
ハッシュはスタックしないでください。むしろ、複数のハッシュの結果はXORされるべきです。このようなプリミティブ(複数の信頼できるハッシュ関数をXORすること)をPBKDFまたは同様のループで使用して、スタックハッシュ関数よりもはるかに優れた結果を得ることができます。費用便益分析に織り込む必要があるのは、そのようなプロトコルは善良な人が実装するために多くの追加の作業を必要とし、悪い購入がSHA-256を破ることができるという証拠はないということです。
次から変更した場合:
myhash = Hash1(Hash2(Hash3(password ^ salt)))
...に...
myhash = Hash1(password + salt + Hash2(password + salt + Hash3(password ^ salt)))
...その後、Hash1の衝突のリスクを減らした可能性があります...