17

セキュリティのためにすべてのユーザーに一意の PIN コードを割り当てる必要があるシステムの開発を検討しています。ユーザーは、自分自身を識別する手段としてのみ、この PIN コードを入力します。したがって、ユーザーが別のユーザーのピンコードを推測できるようにしたくありません。最大ユーザー数が 100000 であると仮定すると、この PIN コードはどのくらいの長さにする必要がありますか?

例: 1234 4532 3423

ある種のアルゴリズムを介してこのコードを生成する必要がありますか? または、ランダムに生成する必要がありますか?

基本的に、他の人のピンコードを推測できるようにしたくないので、十分な数のユーザーをサポートする必要があります。

私の質問が少し紛らわしいように聞こえる場合は申し訳ありませんが、疑問があれば喜んで明確にします.

どうもありがとうございます。

アップデート

以下のすべての投稿を読んだ後、さらに詳細を追加したいと思います。

  1. 私が達成しようとしているのは、スクラッチ カードに非常に似たものです。
  2. ユーザーにはカードが渡され、暗証番号を見つけるためにスクラッチする必要があります。
  3. この PIN コードを使用すると、ユーザーは私のシステムにアクセスできる必要があります。

ユーザーがスクラッチ カードを使用するのを思いとどまらせてしまうため、追加のセキュリティ (ユーザー名とパスワードなど) を追加することはできません。制限内で PIN コードを推測するのをできるだけ難しくしたいと考えています。

素晴らしい回答をありがとうございました。

4

11 に答える 11

9

一意の既知のユーザー ID に追加する場合は、4 桁の乱数で十分です (数値でもかまいません) [starblue の推奨に従って]

疑似乱数ジェネレーターも問題ないはずです。これらは、可逆暗号化 (AES) または一方向ハッシュを使用して DB に格納できます。

あなたが持っている主な関心事は、ロックアウトされる前に、人が PIN を何回誤って入力できるかということです。これは低く、たとえば 3 前後に設定する必要があります...これにより、人々が他の人の数字を推測するのを防ぐことができます。

6桁を超えると、人々はそれらを忘れるか、さらに悪いことに、モニターの付箋に書き留めます.

アカウントが 3 回の不正な試行でロックされると仮定すると、4 桁の PIN とユーザー ID コンポーネントの UserId (999999) + Pin (1234) があると、誰かが推測する可能性が 3/10000 になります。これは受け入れられますか?ピンの長さを5にして3/100000を取得しない場合

于 2009-01-01T10:10:43.810 に答える
8

別のアプローチを提案できますか?Perfect Paper Passwordsとそれが促した派生物を見てみましょう。

これを「そのまま」使用して、ワンタイム PIN を生成したり、単純にユーザーごとに 1 つの PIN を生成したりできます。

また、PIN の重複自体は問題ではないことにも注意してください。攻撃を行うには、単純に複数のユーザー ID を試す必要があります。

(マイレージ警告: 私は間違いなくセキュリティの専門家ではありません。)


2 番目の回答は次のとおりです。読み直したところ、ユーザー ID 自体は必要ないと思います。発行されたスクラッチ カードのセットを検証しているだけです。また、アルファベットの PIN を使用したくないと思います。

有効な PIN を推測する確率が 1/(保護できる試行回数) 未満になるような PIN の長さを選択する必要があります。したがって、たとえば、100 万の有効な PIN があり、10000 回の推測から保護したい場合、10 桁の PIN が必要になります。

John Graham-Cumming のバージョンの Perfect Paper Passwordsシステムを使用すると、次のことができます。

  1. (たとえば)10桁の10進数ピン用にこれを構成します
  2. 秘密のIV/キーフレーズを選択してください
  3. 最初の 100 万個のパスワード (/PIN) を生成 (たとえば)

これは、たとえば 25 桁の英数字の製品 ID を生成するために使用できる一般的な手順だと思います。

逐次近似で申し訳ありません。あなたの求めているものに少しでも近づくことを願っています。

于 2009-01-01T11:01:23.083 に答える
5

最大100,000人のユーザーを想定すると、0〜99,999の一意のPINを持つことができます。5桁。

ただし、これにより、最大ユーザー数のPINを推測しやすくなります。PINの試行回数を制限できる場合は、PINを短くすることができます。例えば。IPごとに1日あたり最大10回の試行の失敗。

それはまた、あなたが保護しているものの価値と、奇妙なものが出た場合にどれほど壊滅的なものになるかにも依存します。

短くしたい場合は9桁、自動推測からもう少しセキュリティを強化したい場合は12桁にします。

PINを生成するには、高解像度バージョンの時間をソルトと疑似乱数とともに取得し、ハッシュを生成して最初の9桁または12桁を使用します。新しいPINの生成の間に合理的でランダムな遅延があることを確認してください。ループで生成しないようにし、可能であればユーザーが開始するようにしてください。

例えば。左(Sha1(DateTime + Salt + PseudoRandom)、9)

于 2009-01-01T13:30:02.580 に答える
5

これまでのところ、シンプル、効果的、そしてエレガントな素晴らしい答えがたくさんあります!

このアプリケーションは、各ユーザーがスクラッチ カードを取得し、それを使用してアプリケーションに "彼はすでに当選した!" かどうかを尋ねるという点で、宝くじに似ていると思います。したがって、その観点から、いくつかの新しい問題が頭に浮かびます。

war-dialing、またはそれに相当するインターネット: 悪意のあるユーザーがアプリを繰り返し攻撃することはありますか? その可能性がある場合は、特定の場所からの試行回数を制限することを検討してください。効果的な方法は、たとえば、同じ IP アドレスから 5 秒ごとに 1 回以上の試行を拒否することです。これにより、マシン主導の攻撃が非効率になり、ロックアウトの問題が回避されます。

ロックアウトの問題:試行に何度か失敗した後でアカウントを永久にロックすると、サービス拒否攻撃を受けやすくなります。上記の攻撃者は、一定期間後にアカウントを再アクティブ化しない限り、事実上すべてのユーザーをロックアウトする可能性があります。ただし、攻撃者は特定のユーザー ID のすべてのキーを試す可能性があるため、PIN がユーザー ID + キーの明らかな連結で構成されている場合にのみ問題になります。この手法では、PIN の数桁のみが完全にランダムであるため、キー スペースも大幅に削減されます。一方、PIN が単に一連の乱数である場合、ロックアウトは送信元 IP アドレスに適用するだけで済みます。(試行が失敗した場合、有効なアカウントは影響を受けないので、何を「ロック」しますか?)

データの保存: 宝くじのようなシステムを実際に構築している場合は、当選した PIN を保存するだけで済みます。ユーザーが PIN を入力すると、PIN/賞品 (または同等のもの) の比較的小さなリストを検索できます。「負けた」および無効な PIN は、「申し訳ありませんが、次回はよろしくお願いします」というメッセージまたは経済学が正しければ「デフォルト」の賞品と同じように扱うことができます。

幸運を!

于 2009-01-02T05:39:51.857 に答える
2

乱数生成アルゴリズムを使用する場合、 "00038384882" のような PIN はありません。整数は "0" で始まることはないため、0 (ゼロ) で始まります。PIN は、0 を除く 1 ~ 9 の数字で始まる必要があります。

多くの PIN 番号がゼロで始まり、多くのゼロが含まれているのを見てきました。削除された数の数を計算するための順列の必要性。

ハッシュに 0 ~ 9 の数字を入れて、ハッシュからランダムに取得し、文字列の PIN 番号を作成する必要があると思います。

于 2012-03-08T11:24:42.443 に答える
2

問題は、「攻撃者が行っている推測と比較して、有効な PIN コードを見つけるために平均で何回の推測が必要か?」ということです。

100 000 の 5 桁のコードを生成する場合、明らかに 1 回の推測が必要です。これで十分である可能性は低いです。

100 000 個の n 桁のコードを生成すると、(n-5)^10 回の推測が必要になります。これで十分かどうかを判断するには、システムが間違った推測にどのように反応するかを検討する必要があります。

攻撃者 (またはすべての攻撃者を合わせたもの) が 1 秒あたり 1000 回の推測を行うことができる場合、決定的な攻撃者を阻止するには明らかに n がかなり大きくなければなりません。3 回誤った推測を行った後に IP アドレスを永久にロックアウトした場合、特定の攻撃者がたとえば 1000 を超える IP アドレスにアクセスする可能性は低いため、ほとんどすべての攻撃者を阻止するには n=9 で十分です。明らかに、分散型攻撃やボットネットからの攻撃に直面する場合、攻撃者ごとに 1000 個の IP アドレスはもはや安全な想定ではありません。

将来、さらにコード (100 000 以上) を発行する必要がある場合、有効なコードを推測しやすくなります。したがって、サイズを修正する前に、将来のスケーリングのニーズを確認するために、今しばらく時間を費やす価値があるでしょう。

あなたのスクラッチ カードの使用例を考えると、ユーザーがシステムを長期間使用する場合は、最初の使用後に PIN コードを選択したユーザー名とパスワードに「アップグレード」することを許可 (または強制) することをお勧めします。システムの。次に、カードから番号を入力するだけの最初の使用の容易さを捨てることなく、ユーザー名/パスワードの通常の利点を得ることができます.

番号を生成する方法については、おそらく生成したものごとに保存します。その場合、ランダムに生成して重複を破棄すると思います。何らかのアルゴリズムを使用してそれらを生成し、誰かがそのアルゴリズムを理解した場合、彼らは有効な PIN コードを理解できます。誰かがアルゴリズムを理解できないようなアルゴリズムを選択した場合、それはほとんど疑似乱数ジェネレーターです (PRNG のもう 1 つの特性は、それらが均等に分散されていることです。コードを推測するのが難しくなります)、その場合はランダムに生成することもできます。

于 2009-01-01T12:33:36.877 に答える
0

PHPとMySQLデータベースでこれを行ったことがあります。生成プロセスを開始する前に、必要なコードの数 - $n、長さ $l、文字数 $c - を作成できることを最初に確認する順列関数がありました。

次に、それぞれの新しいコードをデータベースに保存し、UNIQUE KEY エラーを介して、衝突 (重複) があったことを知らせます。次に、$n 個のコードの作成に成功するまで続けます。もちろん、これはメモリ内で行うこともできますが、MS Word の差し込み印刷で使用するためにコードを保持したかったのです。それで...次に、それらをCSVファイルとしてエクスポートしました。

于 2009-01-02T05:58:12.493 に答える
0

ユーザーの唯一の識別手段として PIN コードを使用したいようです。実行可能な解決策は、最初の 5 桁を使用してユーザーを識別し、PIN コードとして 4 桁を追加することです。

PIN を保存したくない場合は、ユーザー番号とシステム全体の秘密コードに暗号学的に安全なハッシュ (SHA1 またはそれ以上) を適用することで計算できます。

于 2009-01-01T10:18:10.267 に答える
0

ターゲット ユーザーの PIN を推測することと、有効なユーザーの PIN を推測することには違いがあります。あなたのユースケースから、PINは特定のリソースへのアクセスを取得するために使用されているようであり、攻撃者が特定のユーザーIDではなく、そのリソースを狙っている可能性があります。その場合は、有効な PIN 番号を、同じ桁数の可能なすべての番号の中で十分にまばらにする必要があります。

いくつかの回答で述べたように、アルゴリズムから生成するかどうかに関係なく、PIN を十分にランダムにする必要があります。ランダム性は通常、PINのエントロピーによって測定されます。

ここで、PIN のエントロピーがNで、システムに2^M人のユーザーがいるとします ( M < N )。ランダムな推測で有効な PIN が生成される確率は2^{MN}です。(ラテックス表記で申し訳ありませんが、十分に直感的であることを願っています)。次に、そこから、与えられたNMでその確率が十分に低いかどうかを判断したり、目的の確率とMから必要なNを計算したりできます。

PIN を生成するにはさまざまな方法があるため、生成したすべての PIN を覚えておく必要はありません。ただし、安全にするには非常に長い PIN が必要です。これはおそらくあなたが望むものではありません。

于 2009-01-01T13:09:13.573 に答える
0

ある種のアルゴリズムを介してこのコードを生成する必要がありますか?

いいえ、予測可能です。

または、ランダムに生成する必要がありますか?

はい。暗号ランダム ジェネレーターを使用するか、ユーザーが独自の PIN を選択できるようにします。

理論的には、ATM カード発行者はそれだけで非常に大きなコミュニティをサポートできるため、4 桁で十分です (明らかに、一意にすることはできませんし、一意である必要もありません)。ただし、その場合は、PIN の入力試行回数を制限し、銀行が行うように、試行回数を超えるとロックアウトする必要があります。また、ユーザーにユーザー ID を提供してもらう必要があります (ATM の場合、事実上カード上にあります)。

そのように制限したくない場合は、PIN のアイデアを捨てて、標準のパスワードを使用するのが最善かもしれません (これは基本的に PIN であり、文字数が非常に短く、文字セットが限られています)。絶対に数値に制限する必要がある場合 (PIN パッドなどがあるため)、4 を固定長ではなく (構成可能な) 最小長にすることを検討してください。

PIN をクリアな状態でどこにも保存しないでください (たとえば、パスワードのようにソルト アンド ハッシュします)。しかし、短い長さと制限された文字セットを考えると、それを確認する簡単な方法を考えると、ブルート フォース検索に対して常に脆弱になります。 .

要件について詳しく教えていただければ、他にも使用できるさまざまなスキームがあります (これは Web アプリですか? 組み込みシステムですか? など)。

于 2009-01-01T10:52:09.607 に答える