web-dev-qa-db-ja.com

ダイスウェアの実装:ダイスロールをシミュレートする必要がありますか?

ダイスウェア方式に基づいてパスワードを生成するための小さなユーティリティを作成しています。現時点では、実際のダイスウェアのアルゴリズムに非常に近いです。つまり、ローリングダイス_n-times_をシミュレートして、リストから1つの単語を取得します。

これが本当に必要なのかと思っています。単一の単語を取得するには、_0_とlength(diceware_list) -1の間の乱数を取得するだけで十分ではないでしょうか?

そのような単純化されたアプローチは、生成されたパスワードのセキュリティに影響を及ぼしますか? (私は暗号的に安全な乱数のソースを使用しているので、これは問題ではありません)。

簡略化された方法は大丈夫だと思いますと思いますが、私にはわかりません。誰か助けてくれませんか?

14
MaciekTalaska

Dicewareがサイコロを使用してパスワードを選択することを推奨する理由は、ユーザーが取得するパスワードが生成されることを保証するためですランダムに。したがって、プログラムが予測できない(暗号化された安全なランダムな選択によるランダムな選択)方法でパスワードを選択していることが確実である限り、パスワードが実際に生成される方法は問題ではありません。

どのプログラムでも複製することが不可能なサイコロを使用する他の理由があります:

  1. ユーザーに対して完全に透過的です。コンピュータプログラムを信頼して、適切な暗号化乱数ジェネレータを使用したり、パスワードを悪意のある俳優に漏らしたりする必要はありません。
  2. 100%マルウェア対策。サイコロを転がしている最中にWebカメラをテーブルに向けない限り、PC上の悪意のあるプログラムが、生成しているパスワードを観察したり影響を与えたりすることは物理的に不可能です。

ユーザーが特に偏執的でない限り、新しいパスワードを即座に生成するという追加の利便性を優先して、これらの利点を放棄しても大丈夫になる可能性は十分にあります。

29
Ajedi32

はい、これで問題ありません。適切なPRNGを使用すると、制限(1〜n)を正しく行うと、各要素が選択される確率がまったく同じになります。 (私は それを正確に行うダイスウェアの実装を個人的に行った を持っています。)

物理的なダイスウェアプロセスで複数のダイスが使用される単純な理由は2つあります。

  1. 6面ダイスは至る所にあり、安価です。
  2. 7776両面ダイ(6 ^ 5)は、私の知る限り存在しません。また、読むのに十分な大きさの場合はロールするのが不便であり、従来の方法でロールするのに十分小さい場合は読むのが困難です。

「制限(1からn)を正しく行った場合」と言ったことに注意してください。乱数生成ライブラリが1からnまでのプリミティブを提供しない場合、notは単により大きい値をとり、nを法としてください!これは正しい範囲の回答を提供しますが、それらは均一に分散されません。次のいずれかを行う必要があります。

  1. 許容範囲内の値が返されるまで再試行し続けます(つまり、すべての値> nを破棄します)
  2. 線形スケーリング:Rand_val * n / Rand_max(丸め誤差を回避するために任意の精度の計算が必要になります)
15
David

Ajedi32の答えは素晴らしいものです。私はあなたの質問によりよく答えるために役立つかもしれない一つの詳細を強調したかったです。安全なパスワード生成の鍵は、パスワードがnpredictableであることを確認することです。 「ランダム」ではありません。ランダムのアイデアは後で来ます。目標は予測不可能です。考えてみれば、現存する最も安全なパスワードはランダムなものではなく、攻撃者が推測する最後のパスワードです。彼らが予測できなかったものです。

さて、実際には、ここでは猫とマウスのゲームが進行中です。最も予測不可能なパスワードを考え出そうとすると、彼らはパスワードの生成方法を予測しようとします。これが、qazxswedcのようなパスワードがランダムに表示される理由ですが、パスワードを生成するために何をしていたかがわかると、簡単に解読されてしまいます。

これがランダム性がついに登場する場所です。現代の暗号化では、攻撃者が予測できないだけでなく、自分自身も含めてanyoneが予測できない数値を使用するように努めています!乱数とは、文字通り予測できない数値です。番号が生成されたときに監視していた場合にのみ、どの番号が選択されたかを知ることができます。ランダム性とは、自分自身が世代を制御していなかったため、パスワードを予測することがどれほど難しいかについて数学的なステートメントを作成できることを意味します。

何千年もの間、サイコロは乱数の「標準」ソースでした。他にもたくさんありますが(例えば、伝統的にはノコギリソウの束を使っていました)、サイコロは長い間続いています。適切にキャストすると(ヘリコプターなし!)、ダイのバウンスは非常に無秩序で予測不可能であるため、それらは十分に良い乱数ソースです。結果に影響を与えるには、テレケネシスが必要になります(スターウォーズ:ファントムメナスと考えてください)。

いくつかのコメントで言及されているように、ロードされたサイコロが心配な場合は、実際に統計分析を行って、ロールごとに実際に信頼できるエントロピーのビット数を判断できます。パスワードの生成は、カジノよりもサイコロに敏感ではありません(いつでもロールを追加して、可能性の数を増やすことができます。カジノは現金を出しますので、ラウンドごとに乗算する必要がないため、追加する必要があります。敏感)。

だからあなたが何を成し遂げようとしているのか理解しているので、今あなたの質問に近づくことができます。シミュレーションにランダム性のソースが組み込まれていない限りシミュレーションは毎回同じことをするので、実際にはサイコロのシミュレーションはうまく機能しません。

問題は、どのランダムソースを信頼できるかです。ここで、脅威モデルを理解する必要があります。攻撃者は何ができますか?攻撃者はキーストロークを読み取ることができますか?その場合、パスワードを入力する必要があるため、問題が発生します。したがって、実際には、攻撃者がマシンを制御してキーストロークを読み取ることができないと想定できます。

そこから作業を続けることができます。私の推測では、あなたの脅威モデルはあなたのコンピュータが原始的であると仮定していると思います。その場合、/dev/random。この場合の最良の答えは、そのソースから描画して直接使用することです(ダイスシミュレーションは不要)。

セキュリティにもっと関心がある場合は、他の側面を見ることができます。一部のアルゴリズムは、サイドチャネル攻撃に問題があり、特殊な状況では攻撃者がその状態をピアリングできるため、これらに対してアルゴリズムを強化する場合があります。コンピューターの通常のエントロピーのソース(キーストロークとネットワークアクティビティの間の時間など)を信頼しないと決定する場合があるため、ハードウェアのランダム性のソース(多くの場合、抵抗ネットワークのノイズを中心に構築される)に投資する場合があります。

しかし、それをどこへ行っても、キーは予測不可能であること、そして対戦相手があなたを予測できないようにするための標準的な方法は、自分が予測できないほどランダムであることです。

3
Cort Ammon

乱数ジェネレーターは「疑似ランダム」と見なされ、数学的に計算されるため、真にランダムではありません。サイコロは真にランダムであると考えられていますが、物理学は同じであるとあなたは主張することができます...

プログラムでサイコロの回転をシミュレートすることにより、サイコロが必要とする真のランダム性を取り除きます。したがって、シミュレートされたサイコロとランダムな単語の選択の間の混乱は、どちらも疑似ランダムです。

1
rtaft