web-dev-qa-db-ja.com

パスワードハッシュ関数の難易度をどのように選択すればよいですか?

パスワードハッシュを適切に実行し、bcrypt、scrypt、またはPBKDF2を使用していると仮定すると、適切な難易度係数を選択するにはどうすればよいですか?つまり、bcryptではラウンド、PBKDF2では反復、scryptではmaxtime、maxmemまたはmaxmemfracです。

また、最悪のシナリオが発生し、ユーザーのハッシュとソルト(およびアプリケーションのソルトまたはペッパー)が発生すると想定します。知っている...最悪のケース)がリークされます、誤ってまたは故意に。

次の値を選択する必要があります。

  1. 私には十分簡単です。
  2. 攻撃者には難しすぎます。

最初の部分は比較的簡単です。 bcryptに0.5秒かかるのに十分なラウンドを選択した場合、ユーザーがログインしたときに大幅なスローダウンが発生しないことを確信できます。 (とにかく、Webアプリでは、0.5秒はそれほど長い時間ではありません。)また、その関数のループをテストすることで、1分あたりのログイン数を現在よりもはるかに多く処理できることがわかります。取得するログインの割合が増えると、ラウンド数を減らして、ユーザーがログインするたびにユーザーを移行できます。または、より良い、より安価なハードウェアを待つこともできます。アップグレードサイクルで当然、より良く、より安価なハードウェアを手に入れたら、補償するラウンド数を増やすことができます。

答えるのが難しい質問は、攻撃者にとって難しすぎることです。もちろん、それは特定の攻撃者に対するパスワードの値に依存しますが、この質問では、これらのユーザー/パスワードの組み合わせのほとんどが実際に値を持つ他のサイトで機能するという事実以外に特別な値は想定していません。

0.5の代わりに0.01秒かかるようにbcryptラウンドの数を変更した場合、ブルートフォースパスワードがブルートフォースのコストよりも価値があるように、攻撃者の方程式が変更されましたか?持っているかどうかはどうすればわかりますか?

これは、次の知識に基づいて計算するのはかなり簡単なようです。

  1. 一般的なユーザー名とパスワードのペアの価値。
  2. $ hash_functionのハッシュを$ difficulty_factorでブルートフォースするのにかかるコスト。

ScryptはCPUハードではなくメモリハードになるように設計されているため、2に対する答えはアルゴリズムによって異なります。 CPU/GPUの速度が上がる、またはRAM価格が下がるので、それは直線的な速度向上ではありません。

新しいハードウェアが利用可能になったときに更新される上記の情報を確認できる場所はありますか?

これまでにパスワードの値について見つけた最良のリソースは、ブライアンクレブスによる これこれ などのブログ投稿です。 1秒あたりにクラックされるハッシュの場合は、 "DEFCONでのクラックミー"コンテスト です。 1ドルあたりにクラックされたハッシュはいいでしょう。

これらのアルゴリズムのアルゴリズムの欠陥は回答で無視してください。それらの1つが見つかった場合は、他の代替アルゴリズムの1つに切り替えるだけです。これらのいずれかに欠陥が見つかった場合、それはセキュリティニュース全体に及ぶと思います。


ちょうど見つかりました Crypto.SE上scryptを定義する論文 からのこのテーブル:

Table of estimated cost of hardware to crack a password in one year.

必要なのは、そのテーブルを毎年更新することだけです。

10
Ladadadada

残念ながら、既存のすべてのハードウェアアーキテクチャとそのアーキテクチャに最適なbcrypt/scrypt/PBKDF2 implementationsの調査を最初に行わない限り、多種多様なハードウェアにより、必要なテーブルを構築できません。 scryptの記事の表でさえ、あなたが望んでいるものではありません。攻撃者にとってどれほどの費用がかかるかはわかりません。それは、攻撃者にとってどのくらいのコストがかかるかを示しています記事を書くときにscrypt設計者が考えたハードウェアとソフトウェアを使用して.

ちなみに、そのような見積もりはうまくスケールアップしません。私が利用可能なハードウェアで100億ドルと推定される攻撃コストに直面した攻撃者である場合、最初に10億ドルを投資して、その仕事をより高速にするカスタムASICベースのシステムを構築します。 PCはgoodで擬似ランダムRAMアクセスしますが、最高の可能性ハードウェアではありません。攻撃には役に立たないPCの他のコンポーネント。

少なくともPBKDF2の場合、計算はメモリアクセスの問題のない基本的なハッシュ関数にマッピングされるため、既存のハッシュ関数のベンチマークを使用してアイデアを得ることができます(例 これらのもの )。


そうは言っても、すべてが失われるわけではありません。攻撃コストの正確な見積もりを取得することはできませんが、それはあなたができることは泣き叫び、身をすくめ、そして死ぬことだけではありません。最初の実用的な方法は、反復回数を設定することですできるだけ多く:通常のログインプロセスを許容できないほど遅くしない最大値に設定します。そうすれば、セキュリティがgoodであるかどうかはわかりませんが、-できる限り良好になります。それは慰めです。

残りの作業はユーザー側で行います。結局のところ、パスワードハッシュの難しさはムーアの法則に対抗するためにあります。ただし、よくても、これはパスワードエントロピー攻撃者の忍耐力の一致です。

  • 攻撃者の利点は、金持ちであり、専用のハードウェアを購入できることです患者:価値の高いパスワードの解読に1時間、おそらく1日費やす余裕があります。一方、ユーザーはログイン時に1秒以上待つことを許容しません。
  • 防御側の利点は、パスワードエントロピーです。

攻撃者の効率係数1000(専用ハードウェア、それに投入されるより多くのドル)および忍耐力86400(攻撃者は1日以内に成功することを望んでおり、ユーザーは1秒以上待たない)、そしてパスワード防御側がゲームに勝つためには、エントロピーが8,600万(別名26ビット超)を超える必要があります。パスワードエントロピーを上げるには、教育する、教育する、そしてもう一度教育するという1つの方法しかありません。 「パスワードルール」を強制しないでください。強力なパスワードを作成するのではなく、ユーザーを妨害します。代わりに、非必須パスワードジェネレータボタンを提供します。これは、たとえば40ビットのエントロピーでパスワードを生成し、ボタンを使用することは非常に良いアイデアであることをユーザーに説明します。

6
Thomas Pornin

ターゲットハードウェアを使用して、アルゴリズムが1/10秒かかるようなコストを選択します。ログイン試行の失敗後の遅延を実装します。ひどく選択されていないパスワード(ユーザー名、サイト名、「パスワード」など)を総当たりにすることは、費用対効果が高くありません。選択する実際の値は、ターゲットハードウェアによって異なります。

1
  1. パスワードが弱い場合、アルゴリズムの速度は重要ではありません。
  2. パスワードが辞書に載っている場合、ほぼ瞬時にねじ込まれます
  3. jtRまたはHashcatに含まれているルールによってパスワードが生成された場合、少し後で混乱します;)

それ以外に、いくつのユーザー/パスワードを保存していますか? 1つのアカウントのみを保護している場合(ルートアカウントのみが含まれているサーバーを考えてください)、ソルティングは役に立ちません。

どのくらいの頻度でパスワードの変更を強制されますか?パスワードの難しさが攻撃者に完全な文字セット、長いパスワード総当たり攻撃を強いる場合、適切な近似を行うことができます:NumberOfCombos/CrackSpeed = TimeToCrack

したがって、6文字の長さで、完全にランダムに印刷可能なASCII(95シンボル)で、1秒あたり100をクラックできる場合、95 ^ 6/100 = 233年で、キースペース全体。

ただし、高速のアルゴを使用している場合(私のGPUが単一、単一のラウンド、無塩のMD5を80億/秒でクラック)、適切なハードウェアを投げると、6文字のキースペース全体を約90でクラックできます秒。同じ文字セットで長さ7に進むと、クラックする時間が2時間以上に延長され、長さ8で9日に延長されます。したがって、90日ごとにパスワードを変更すると、攻撃者はその長さ8、文字セット95のパスワードを解読して使用するための十分な時間を確保できます。

ルールは単純です。文字セットを大きくすると、パスワードを長くすると、キースペースが途方もない速度で成長します。最新のハードウェアとソフトウェアはクラッキングを非常に速くしますが、ソルト/アルゴで脅威を軽減できます。本当のキラーは、攻撃者にブルートフォースシナリオを強制しなかったときです。辞書/ルール/順列/複数単語の組み合わせ攻撃は非常に非ランダムなパスワードを見つけるのに効率的です。

0
Marcin