web-dev-qa-db-ja.com

さまざまな辞書の単語からランダムにパスワードを生成することは暗号的に安全ですか?

XKCDコミックのパスワードの強さ を知っている必要があります。これは、(適切に)multiple一般的な単語に基づくパスワードの方が、Aw3s0m3s4u(3などのパスワードよりも安全で覚えやすいことを示唆しています。 。

ある程度安全なパスワードを生成したいアプリケーション(マルチプラットフォーム)があり、パスワード要件はそれほど厳しくありません。パスワードにスペースがない場合、「複数の記号、数字、アルファベットと6文字以上の文字の混在」が予想されます。 、ただしパスワードに複数の非連続スペースがある場合==記号/数字/大文字と小文字の混在の制約を緩和し、代わりに少なくとも以上の2つの単語が必要個別に4文字、パスワードの長さは15文字以上。

問題はthatアスペクトについてではなく、生成についてです。ユーザーのために覚えやすく推測しにくいパスワードを生成したい場合、パスワードを生成することは暗号的に安全ですか? 10kワードリストから5つほどの辞書の単語に基づいていますか? (文字通り、1万語が私のデータベースにあり、さまざまなソース、電子メールなどから削り取られています。)これらはすべて3文字以上の長さのかなり一般的な単語です。

現在、私はwantでこれらのワンタイムパスワードを作成していませんが、私は少なくともにログイン後にユーザーに別のパスワードに変更するよう要求する必要があると考えていますこの生成されたパスワードを使用することは問題ありませんcanですが、ユーザーに(パスワードの変更時に)自分の要件に合った「安全な」パスワードを生成するオプションも必要です。

クラッキングの観点から、このスキームを使用して生成されたパスワードを攻撃することはどのくらい簡単/困難ですか?固定長はありません。このデータベーステーブルの単語の長さは3文字から11文字です(たとえば、environmentはデータベースの単語です)?パスワードを生成するプログラムは、4文字以下の2つの単語を選択しません(したがって、最短のパスワードは、3文字の単語が1つ、5文字が4つになりますワード、および4つのスペース、合計27文字)、およびそれは、パスワードで同じ用語を2回使用しません

私がそれに対して実行したサンプルに基づいて、プログラムによって生成されたパスワードの平均の長さは〜34文字であり、これは私には許容できるようです。 27個の最小の非スペース文字(つまり、最後の23文字)が26個の可能な状態(a-z)になる可能性があると仮定しても、それは23^26または2.54e+35の可能性です。

データベースには、3〜4文字の長さの994語があります。

また、攻撃者がhas辞書であり、生成パラメータ/アルゴリズムであると想定することもできます。これはまだ安全ですか、1つのWordを生成されたパスワード(エントロピーのみに基づく18^26の可能性(4.33e+32)の場合は21文字です)から解放できますか?唯一の問題は、これが以下に基づいていないことです- 文字エントロピー、ただしWordエントロピーでは、5ワードのパスワードは10000*9006*9005*9004*9003の可能性、または6.5e+19の可能性であり、4ワードのパスワードは10000*9006*9005*9004の可能性、または7.30e+15です。通常の6文字のパスワード((26+26+10+33)^6または7.35e+11の可能性:26の小文字、26の大文字、10の数字、33の記号)と比較すると、はるかに強力です。

私が作った別の仮定:ユーザーwillこれを書き留めてください、彼らは常にします。私容疑者一枚の紙に書かれた5つのランダムな単語(うまくいけば直接見えないが、悲しいかな、それが最もありそうなシナリオだ)は、 見えるという従来のパスワードのような複雑な用語よりも、潜在的なパスワード.

最後に、実際の質問に進む前に、パスワードはデータベースに保存される前にallソルトされ、次にSHA-512アルゴリズムで100回ハッシュされます。ソルトは各ハッシュの間に追加されます。ユーザーが正常にログインすると、ソルトが変更され、新しいパスワードハッシュが作成されます。 (これはブルートフォースのオフライン攻撃ではあまり役に立たないと思いますが、私が思うにアクティブなオンライン攻撃に対しては役立つはずです。)

DatabasePassword = SHA512(...SHA512(SHA512(SHA512(password + salt) + salt) + salt) + salt)...)

それで、最後に、私のactual質問:

  1. 私の数学は正しいですか? (あなたは必ずしもこれに答える必要はありません、私はそれが私の懸念を実証するために原則的に十分に近いと確信しています。)
  2. これはgeneration安全ですか、それとも「従来の」パスワード生成に固執する必要がありますか?攻撃者は、ユーザーのパスワードがこのアルゴリズムで生成されたものか、ユーザーによって選択されたものかについて、anyの考えを持っていないことに注意してください。攻撃者は推測を行うことができます if彼らは長さを知っていますが、それは安全な長さかもしれませんし、そうでないかもしれません。
  3. 最後に、この「アイデア」のセキュリティを大幅に変更(増加または減少)することを想定しましたか? (たとえば、6文字のパスワードの文字ごとのエントロピーは95であると想定します。)

長さについてお詫びしますが、私はうまくいけばに自分自身を過度に説明することに慣れ、混乱を軽減します。


私の質問は非常にこれ に類似していることが指摘されましたが、私の生成方法の違いを指摘したいと思います(ただし、正直に言って、重複と見なすことができます。決定はコミュニティに任せます)。

  1. 各Wordはスペースで区切られます。つまり、最初と最後の3文字を除くすべての文字に追加のpotential状態があります。
  2. パスワードはnotであり、人間が選択したものであり、(ほとんど)均一なランダム生成です。 onlyを除いて他の単語よりも優先される単語はありません。1つの超短(3または4文字)の単語を許可します。ランダムジェネレーターがその長さの単語を選択すると、それ以上選択できなくなります。 (Wordのリスト内での位置はランダムですが、notが選択されている可能性があります。)
  3. これはseparateパスワード制限と混合されます。これは、攻撃者がクラックを試みる2つのベクトルを持っていることを意味します。ユーザーは、「従来の」要件を満たすパスワード、または「XKCD」要件を満たすパスワードを選択した可能性があります。
29
Der Kommissar

まず、暗号的に安全なパスワードという概念はありません。パスワードの目的は、攻撃者が推測するのが難しいことであり、推測するのがどれほど難しいかは、パスワードの使用方法に依存します。3回の試行の失敗後にアカウントがロックされている場合、パスワードは攻撃者の場合よりも弱い可能性があります。無制限の数のパスワードを試すことができるか、攻撃者がハッシュされたパスワードにアクセスできる場合。

あなたのケースでは、1万ワードのセットから5ワードをランダムに選択してパスワードを作成します。攻撃者がディクショナリを知っていると想定すると(要件が単語を覚えやすいのでありそうです)、パスワードがディクショナリから構築される方法は、(10 ^ 4)^ 5 = 10 ^ 20のバリアントがあることを意味します。これは、20桁または12..13のランダムな英数字の大/小文字混合のパスワードを推測することに似ています。このようなパスワードは通常、ほとんどの目的で十分に安全であると見なされています。

パスワードの保存については、独自の方法を考案するのではなく、優れていることが証明された方法を使用してください。詳細については、 パスワードを安全にハッシュする方法を参照してください。 現在の形式では、ハッシュ関数で100回の反復のみを使用しているため、選択した方法は弱いと見なします。高速になるように設計されています。比較のためだけに: PBKDF2 は2000年に少なくとも1000回の反復を推奨しており、LastPassは2011年にサーバー側のハッシュに100.000回の反復を使用しました。幸い、より複雑なパスワードを使用することによる、より弱いパスワードストレージ。

35
Steffen Ullrich

あなたの計算は正しいようです。ただし、以下の弱点を考慮してください。

  1. 攻撃者は、複数の(a[〜#〜] lot [〜#〜]of)アカウントでサービスにサインアップできます。そこから、オリジナルに近いWordリストを作成するのは簡単です。したがって、攻撃者が単語リストを知っていると想定します。
  2. 攻撃者は、パスワードの長さの制限もテストします。 ここ で説明されているように、パスワードの長さが最低12文字であることは、連続した辞書の単語が使用されるため、検索スペースが減少することを攻撃者に示す良いヒントです。
  3. 実際のWordリストも違いがあります。 Wordリストが8文字を超える長い単語で構成され、パスワードの最大長が30であるシナリオを考えてみます。これは、攻撃者が4文字の連続する8文字の単語でパスワードが構築されないことを安全に想定できることを意味します。これと同様に、Wordリストの選択に応じて、多くの仮定が存在する可能性があります。見逃したと思うもう1つの考慮事項は、語長エントロピーです。
  4. 最後に、安全で覚えやすいパスワードジェネレータをクライアントに提供しているという事実は、クライアントが使用することを意味します。そのため、攻撃者は、ほとんどのセキュリティ認識機能を除くすべてがWordリストとパスワードジェネレータを使用すると想定しても安全です。

それにもかかわらず、あなたの提案は安全だと思います。上記のすべてを考慮しても、結果の検索スペースは依然として巨大です。

これらは私があなたの説明で見つけたすべての問題/仮定ですはあなたのパスワードジェネレータのセキュリティを低下させるかもしれません。あなたの検討のために。

21
MiaoHatola

ミャオハトラの答えに基づく:

MiaoHatolaの最初のポイントまでに、攻撃者はリストを絞り込み、両方の辞書(短い単語の辞書と5文字の単語の辞書)を知ることができます。短いWordリストには994エントリあるとおっしゃいました。 1/994の確率で、最初の試行で短いWordを取得します。ここで、10,000の一般的な5文字の単語のリストを使用するとします。これらの割合は適用されます:

1/994 * 1/10000 * 1/9999 * 1/9998 * 1/9997

この問題は、Wordリストを知っていると仮定して、最初の試行ですべてを推測する可能性を組み合わせたものです。

これは、単語の順序ではなく、単語のみを推測する9,934,037,100,000,000,000分の1の確率です。順序で因数分解すると、かなりの数になります。私の計算機はそんなに高くは数えません。

この数には、MiaoHatolaが3番目のポイントで言及した可能性は含まれていません。これは、最大長がないと述べたためです。もう一つ:

ランダムに毎回5ワードだけを選択する代わりに、その数もランダム化してみませんか?時々余分な7文字のWordを投げます。末尾に2桁の数字が含まれている可能性があります。攻撃者に推測させてみてください。これにより、セキュリティが大幅に向上します。この時点では、ハッシュ化されたパスワードを無防備のままにしておくことができます。これは、可能性が非常に多いためです。だからあなたの質問に答えるために、はい。これにより、セキュリティが向上します。たくさん。

4
user139260

文字はランダムではないため、27文字に基づいて一意性を設定することはできません。

10Kワードで5ワードを使用する場合、10 ^ 20の一意のパスワード(またはフレーズ)
100,000,000,000,000,000,000

それはブルートフォース攻撃を阻止するのに十分ユニークですか
100ミリ秒で30,000年以上

しかし、コストはユーザーが27文字を入力することです。 27文字を入力したくない。私はおそらくそれを1/2回間違って入力し、再入力する必要があります。ランダムな順序で5つの単語を覚えるのは簡単ではありません。

A-Z、a-z、0-9、および_の6文字を検討してください
つまり、62,523,502,209の一意です
ユーザーとして、6つのランダムな数字を覚えて入力したい

ランダムに書かれた5つのランダムな単語がパスワードを偽装する良い方法になるとは思いません。特に人々があなたのアプリケーションがそれをすることを知っているなら。

1
paparazzo