1

序章

私は自分の Web サイトの「賞品コード」システムで作業しています。管理者はクレジットをユーザーに割り当てて、ユーザーが引き換えることができるコードを与えることができます。
アイデア自体は非常に簡単に実装できます。コードを生成し (アルゴリズムはほとんど予測できないと仮定します)、安全なデータベースに保存し、管理者が 1 つのランダムなコードを読み取ることができるようにします。しかし、私が望むいくつかの機能が衝突することがわかりました:

  1. コードは、合理的な計算能力を備えた攻撃に対して合理的に抵抗する必要があります。
  2. 100 万という多数のコードが必要です。
  3. コードは簡単に入力できる必要があります。

今まで、これらの解決策を考えていました:

しばらく考えた後、私はこの解決策を思いつきました: N 単語のフレーズを使用します [「n」単語について話しているのではありません。つまり、「ランダムな単語の N 回」]。これは良い考えのようですが、私はこの分野の経験がありません。

質問1

コードにフレーズを使用しても安全ですか? はいの場合、十分に安全であるためには何語を使用する必要がありますか? [平均的な長さと 8 歳の子供が知っている単語を仮定します。]

質問2

与えられた単語のリストをデータベースに保存する最良の方法は何ですか?

  • デスクトップ側で、目的のフレーズを含むファイルを生成し、PHP を使用してそれらを読み取ってデータベースに入れますか?
  • サーバー側で、単語のリストを読み取り、フレーズをデータベースに直接書き込みますか?
  • 他の方法?

データベースを使用するよりもコーディングが難しいため、管理者にフレーズ ファイルを読み取らせることはできません。また、単語は一般的なイタリア語でなければならないことに注意してください。使用される単語は 4,000 から 6,000 と見積もっています。

4

1 に答える 1

2

コードは適切な (疑似) 乱数から生成されると想定します。それらを大量に生成する場合は、それらを生成するコンピューターの乱数ジェネレーターに十分なエントロピーを提供してください。

あなたが話しているようなコードは、ランダムな印刷可能な文字列として作成されることがよくあります。たとえば、これを行う 1 つの方法は、144 ビットの乱数を生成し、base64 でエンコードすることです。これにより、24 文字の文字列で 144 ビットの情報が得られます。文字列は URL にコピー&ペーストされているか埋め込まれているため、通常は文字列がゴミとして読み取られることを気にしません。この文字列は、それぞれが 64 文字のアルファベットから生成された 24 個のシンボルのシーケンス、またはそれぞれが 2 ビットのアルファベットから生成された 144 個のシンボルのシーケンスと考えることができます。それは同じになります。

CHARACTERS (または BIT) のリストの代わりに WORDS のリストを生成することも同様です。2 ビットまたは 64 文字のアルファベットの代わりに、4000 ~ 6000 語のアルファベットを使用しています。これははるかに大きなアルファベット (より多くの情報) ですが、フレーズ内でより少ないまたはそれらを使用することを期待しています (より少ない情報)。

単語を使用nすると、log₂((4​​000 から 6000)ⁿ) ビットが得られます。簡単にするために、4096 語のアルファベットを選択するとします。144 ビット トークンと同じ量の情報を含めるには、フレーズにそれぞれ 12 語を含める必要があります。

「多数のコード、100 万個のコードが必要です」という要件は不明です。コードスペースが 100 万フレーズでなければならないということですか、それとも、はるかに大きなコードスペースの各部分である 100 万の異なるフレーズを生成するつもりなのですか。

コードスペースを 100 万にする必要がある場合、それはわずか log₂(1000000) = 20 ビットです。2語のフレーズで十分です。それはおそらく小さなコードスペースだと思います...しかし、敵が正しいフレーズを推測できる可能性がどれだけあるか、そしてどれだけ速く推測できるかによって異なります. また、攻撃者が正しいコードを推測することがどれほどの損害を与えるかにもよります。あなたの要件を知らなくても、どのくらいのコードスペースが必要かを推測することしかできません。おそらく2倍のビット数(1兆コード)ですか?

質問 2:フレーズを生成するコンピューターがランダム性の優れたソースを持っている限り、どこでフレーズを生成しても実際には違いはありません。疑わしい場合は、デスクトップを使用してください。次に、RPC、リモート データベース アクセス、またはサーバーへのファイルのコピーなど、それらをデータベースにどのようにロードするかは問題ではありません。

多数のフレーズを生成する場合、それらをプレーンな文字列としてデータベースに保存するとコストがかかることに注意してください。参照単語リストのインデックスである一連の整数としてそれらをエンコードすることで、多くのスペースを節約できます。

余分な : 各フレーズで 2 つまたは 3 つ以上の単語を使用すると、ランダムな文字列と同じようにフレーズを覚えたり入力したりするのが難しくなることに注意してください。これは、それらが実際の単語で構成されていても、文法的に隣り合わせにできない単語を含め、ほとんどが意味のないフレーズになるためです。

これを軽減したい場合は、特定の単語がテキストのコーパス (たとえば、文献のコレクション) で隣り合って出現する頻度の統計モデルを使用して、単語のシーケンスを自然に見えるようにすることができます。人間。隣接する単語の隣接部分、トリプル、または 4 タプルのモデル化は、それぞれ 2 番目、3 番目、または n レベルのマルコフ連鎖と呼ばれます。

明らかに、このようなフレーズを生成すると、フレーズの情報量が (情報理論的な意味で) 減少するため、フレーズを長くすることで補わなければなりません。特定の統計モデルを使用した結果の正確な情報削減量は、計算するための演習として残されています:-)

于 2012-09-06T22:11:23.200 に答える