質問

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

e.g。 1234 4532 3423

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

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

私の質問が少し混乱するかもしれませんが、どんな疑問も喜んで明確にしてくれたら申し訳ありません。

ありがとうございます。

更新

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

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

追加のセキュリティ(ユーザー名やパスワードなど)を追加することはできません。これにより、ユーザーがスクラッチカードを使用するのを阻止できます。制限内でPINコードを推測するのを可能な限り困難にしたい。

すばらしい返信をありがとうございました。

役に立ちましたか?

解決

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

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

また、あなたが保護しているものの価値と、奇妙なものが出た場合の壊滅的な状態にも依存します。

短くしたい場合は9桁、自動推測によるセキュリティをもう少し高めたい場合は12桁にします。

PINを生成するには、高解像度バージョンと salt および場合によっては擬似乱数により、ハッシュで、最初の9桁または12桁を使用します。新しいPINの生成の間に合理的かつランダムな遅延があることを確認して、ループで生成しない、可能であればユーザーが開始できるようにします。

eg。 Left(Sha1(DateTime + Salt + PseudoRandom)、9)

他のヒント

一意の既知のユーザーIDに追加する場合、4桁のランダムな数字で十分です(数字である可能性があります)[スターブルーの推奨どおり]

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

主な懸念は、ロックアウトされる前に、ユーザーがピンを誤って入力できる回数です。これは低くなければなりません。たとえば3程度です。これにより、他の人の番号を推測するのを止めることができます。

6桁を超えると、人々はそれらを忘れるか、さらに悪いことに、モニターのポストイットノートにそれらを書きます。

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

別のアプローチを提案できますか? Perfect Paper Passwords 、および誘導体プロンプトが表示されました。

この<!> quot;現状のまま<!> quot;を使用できます。ワンタイムPINを生成するか、単にユーザーごとに1つのPINを生成します。

PINの重複は問題ではないことにも留意してください。攻撃は、複数のユーザーIDを試すだけで済みます。

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


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

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

John Graham-Cummingのバージョンを使用する場合パーフェクトペーパーパスワードシステムでは、次のことができます。

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

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

逐次近似によってそれを行うことはごめんなさい。探しているものに少し近くなることを願っています。

これまでのところ、多くの素晴らしい答え:シンプル、効果的、エレガント!

各ユーザーはスクラッチカードを受け取り、それを使用してアプリケーションに<!> quot;彼がすでに勝ったか!<!> quot;そのため、その観点から、いくつかの新しい問題が思い浮かびます:

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

ロックアウトの問題:何度か試行に失敗した後にアカウントを永久にロックすると、サービス拒否攻撃。上記の攻撃者は、一定期間後にアカウントを再度有効にしない限り、すべてのユーザーを効果的にロックアウトできます。ただし、これは、攻撃者が特定のユーザーIDのすべてのキーを試す可能性があるため、PINがユーザーIDとキーの明らかな連結で構成されている場合にのみ問題になります。また、この手法では、PIN数字のほんの一部が本当にランダムであるため、キースペースが大幅に削減されます。一方、PINが単なるランダムな数字のシーケンスである場合、ロックアウトはソースIPアドレスにのみ適用する必要があります。 (試行が失敗した場合、有効なアカウントは影響を受けないため、<!> quot; lock <!> quot;?)

データストレージ:何らかの宝くじのようなシステムを実際に構築している場合は、勝ったPINを保存するだけで !ユーザーがPINを入力すると、PIN /賞品(またはそれに相当するもの)の比較的小さなリストを検索できます。 <!> quot; losing <!> quot;を扱うことができます。 <!> quot;と同じように無効なPIN。申し訳ありませんが、次回は幸運<!> quot;メッセージまたは<!> quot; default <!> quot;経済学が正しければ賞を受賞。

がんばって!

質問は、<!> quot;攻撃者が推測している推測の数と比較して、有効なPINコードを見つけるのに平均して何件の推測が必要ですか?<!> quot;

100,000個の5桁のコードを生成する場合、明らかに1つの推測が必要です。これで十分であるとは考えられません。

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

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

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

スクラッチカードのユースケースを考えると、ユーザーが長時間システムを使用する場合は、<!> quot; upgrade <!> quot;を許可(または強制)することをお勧めします。システムの最初の使用後、選択したユーザー名とパスワードへのPINコード。そうすれば、カードから数字を入力するだけの使いやすさを捨てることなく、ユーザー名/パスワードの通常の利点を得ることができます。

番号を生成する方法については、おそらくあなたが生成するそれぞれを保存します。その場合、私はそれらをランダムに生成し、重複を破棄すると言います。任意の種類のアルゴリズムを使用してそれらを生成し、誰かがアルゴリズムを見つけた場合、有効なPINコードを見つけ出すことができます。誰かがアルゴリズムを理解できないようにアルゴリズムを選択した場合、それはほぼ 擬似乱数ジェネレーターです(PRNGのその他のプロパティは、それらが均等に分散されていることです。コードを推測するのが難しくなるため、ここでも役立ちます)、その場合は、ランダムに生成することもできます。

乱数生成アルゴリズムを使用している場合、<!> quot; 00038384882 <!> quot;のようなPINは決してありません。 、 整数は<!> quot; 0 <!> quot;で始まることはないため、0(ゼロ)で始まります。 PINは0以外の1〜9の数字で開始する必要があります。

多くのPIN番号には多くのゼロが含まれており、開始するので、最初の数百万の番号を削除します。置換された数の計算のための置換の必要性。

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

スクラッチカードタイプのPINコードを生成する場合は、約13桁の大きな数字を使用する必要があります。また、クレジットカード番号に似ていて、番号自体にチェックサムまたは確認数字が埋め込まれている必要があります。いくつかの初期データに基づいてピンを生成するためのアルゴリズムが必要です。これは一連の数字である場合があります。結果のピンは、シーケンスの各番号に対して一意である必要があるため、100,000個のピンコードを生成する場合、それらはすべて異なる必要があります。 この方法では、データベースに対して番号をチェックするだけでなく、最初に検証することもできます。

その目的で何かを書いたことがありますが、コードを提供することはできませんが、一般的な考え方は次のとおりです。

  • 12桁のスペースを準備します
  • 数値を5桁(00000〜99999)にフォーマットし、特定の方法でスペースに沿って広げます。たとえば、番号12345は__3_5_2_4__1として拡散できます。偶数か奇数か、3の倍数かなどに応じて、数値の分散方法を変えることができます。
  • 特定の桁の値に基づいて、より多くの桁を生成します(たとえば、3番目の桁が偶数の場合、奇数を作成して最初のオープンスペースに配置し、そうでない場合は偶数を作成して2番目のオープンに配置します)スペース、たとえば_83_5_2_4__1
  • 6桁の数字を生成すると、オープンスペースは1つだけになります。常に同じオープンスペース(最後から2番目のスペースなど)を残す必要があります。その場所に確認数字を配置します。
  • 検証数字を生成するには、生成した数値に対していくつかの算術演算を実行する必要があります。たとえば、奇数位置のすべての数字を追加し、他の数字で乗算し、偶数位置のすべての数字を減算します。最後にすべての数字を加算します(特定の数字の値に基づいてアルゴリズムを少し変更する必要があります)。最後に、生成されたPINコードに含める確認数字があります。

これで、生成されたPINコードを検証できます。特定のPINコードについて、検証数字を生成し、ピンに含まれている数字と照合します。問題なければ、逆の操作を実行して元の番号を抽出できます。

これは、あいまいさによるセキュリティのように見えるため、あまり良い音ではありませんが、これを使用できる唯一の方法です。誰かがピンコードを推測することは不可能ではありませんが、検証数字を持つ12桁のコードであるため、1,000,000,000,000の組み合わせを試す必要があり、有効なピンコードは100,000だけなので、そこにあるすべての有効なピンコード無効なものは10,000,000個です。

これは、使い捨てのピンコードに役立つことを言及する必要があります。ユーザーはこれらのコードのいずれかを1回だけ使用します。たとえば、プリペイド電話を充電する場合です。特に誰かを認証する唯一の方法である場合、これらのピンを認証トークンとして使用することはお勧めできません(1つのデータのみで誰かを認証することは絶対にしないでください;最小値はユーザー名+パスワードです)

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

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

  

このコードを生成するには   アルゴリズムの種類?

いいえ。予測可能です。

  

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

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

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

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

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

要件についてさらに詳しく説明できる場合は、他にもさまざまなスキームを使用できます(これはWebアプリですか?組み込みシステムですか?)。

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

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

今、PINがエントロピー N であり、システムに 2 ^ M ユーザーがいるとしましょう( M <!> lt; N )、ランダムな推測が有効なPINを生成する確率は 2 ^ {MN} です。 (ラテックス表記については申し訳ありませんが、十分に直感的であることを願っています)。次に、その確率が N および M で十分に低いかどうかを判断するか、必要な確率と > M

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

PHPとMySQLデータベースを使用してこれを実行したことがあります。生成プロセスを開始する前に、まず必要なコードの数-$ n、長さ$ l、文字数$ c-を作成できるようにする置換関数がありました。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top