web-dev-qa-db-ja.com

テキスト形式の2FAセキュリティコードは意図的に覚えやすいですか?

銀行口座に2FAセットアップがあります。ログインすると、電話でIMとして6桁のコードを受け取り、ウェブサイトに入力します。これらのコードalwaysにはパターンがあるようです。 111xxx、123321、xx1212などのいずれかです。

これらのコードは一目で意図的に覚えやすいと思います。これらのコードに、覚えやすくするためのパターンがあることを指示する一般的なビジネスプラクティス/ベストプラクティスはありますか?

81
Bob Kaufman

私もこれに気づきましたが、これは人間の脳の ランダムノイズにパターンを適用する傾向 の結果だと思います。これは、数値の文字列を覚えようとするときに、より一般的になるようです。

127
ScarySpider

6桁の乱数の約85%には少なくとも1つの繰り返し数字があり、40%には隣り合う繰り返しの連続数字があります。 (私は私の数学で修正されてうれしいです。)

これらのキーは 標準TOTPアルゴリズム を使用して生成されます。この記事ではこの実装を要約し、覚えやすい数を生成するための努力がないことを示しています。

RFC 6238によると、参照実装は次のとおりです。

  • 任意のバイト文字列であるキーKを生成し、クライアントと安全に共有します。
  • T0、タイムステップのカウントを開始するUNIX時間、およびカウンターCの値の計算に使用される間隔TIに同意します(デフォルトは、UnixエポックがT0で30秒がTIです)。
  • 暗号化ハッシュ方式に同意する(デフォルトはSHA-1)
  • トークンの長さNに同意する(デフォルトは6)

RFC 6238ではさまざまなパラメーターを使用できますが、認証アプリのGoogle実装では、デフォルトとは異なるT0、TI値、ハッシュ方式、およびトークン長をサポートしていません。また、RFC 3548に従ってbase-32エンコーディングでK秘密鍵が入力される(またはQRコードで提供される)ことを想定しています。

パラメータが合意されると、トークンの生成は次のようになります。

  1. T0からTIが経過した回数としてCを計算します。
  2. メッセージとしてC、キーとしてKを使用してHMACハッシュHを計算します(HMACアルゴリズムは前のセクションで定義されていますが、ほとんどの暗号化ライブラリでもサポートされています)。 Kはそのまま渡され、Cは未処理の64ビット符号なし整数として渡されます。
  3. Hの最下位4ビットを取り、それをオフセットOとして使用します。
  4. MSBのOバイトから始まるHから4バイトを取り、最上位ビットを破棄し、残りを(符号なし)32ビット整数Iとして格納します。
  5. トークンは、基数10のIの最下位N桁です。結果の桁数がNよりも少ない場合は、左からゼロで埋めます。

サーバーとクライアントの両方がトークンを計算し、サーバーはクライアントから提供されたトークンがローカルで生成されたトークンと一致するかどうかを確認します。一部のサーバーでは、わずかなクロックスキュー、ネットワーク遅延、およびユーザー遅延を考慮するために、現在の時刻の前または後に生成されるべきコードを許可しています。

56
Michael

私の電話には、さまざまな会社からの約90の確認コードがありました。これらの62は6桁の長さでした。各桁の数は次のとおりです。

おそらく1、8、9へのわずかなスキュー?ほとんど間違いなく、データのノイズのみです(62は小さなサンプルです)。

2桁はどうですか?

enter image description here 最初のグラフは2桁の境界にある2桁のみです(つまり、AABBCC)-したがって、186桁の可能な配置全体で各ペアが約1.86回出現すると予想されます。 2番目は任意の配置です(つまり、XXX99Xは2桁としてカウントされます)。 310個のプレースメントで各ペアが約3.1倍になると予想します。

2桁の数字が2桁でない数字よりもはるかに多く、2桁がオレンジ色で表示されているため、明確なスキューはないようです。後者のデータでは、約31桁の2桁が予想され、27が得られます。これは妥当なようです。

もちろん、これは他の「ランダムでない」パターンを除外するものではありませんが、正直に言うと、人間がパターンを検索する可能性があります。これらの番号を見てください。すべて、私の2FAアプリから取得されています:365 595、111 216、566 272、 468 694、191 574、833 043。

21
Tim

あなたの場合、これがランダムなチャンスであることを願っています。パターンがある場合、それは2番目のコードを持つという全体のポイントを弱めます。

いいえ、意図的に覚えやすくするためのものではなく、ユーザーが6つの数字を入力するときに問題が発生したというフィードバックがない限り、一般的なビジネスケースはありません。それから誰かがばかげたことをしたかもしれないが、私は本当に望んでいない。

14
schroeder

それはまた、人間が無作為性について考える傾向があることとも関係しています。真のランダム性では、数字の繰り返しとパターンの繰り返しが、予想よりも頻繁に発生します。人間がランダムに「見える」数字のシーケンスを作成するように求められた場合、パターンや数字(および「7」を使いすぎ、「0」と「2」を使いすぎなどの他の癖を繰り返すことを避ける傾向があります。等)。 1〜100の間の「ランダムな」数を選択するように頼むと、7が含まれることが多く、37(または17)になることがよくあります。 (多くの場合)人々がランダムに見えるものを選択しようとしているときに、人々が手動で選択する宝くじの番号を調べることができます(ランダムに見える番号はランダムな抽選で勝つ可能性が高いという誤った信念に基づいています)。

人間がランダムなコイントスをエミュレートしようとしている場合、彼らは最後の結果を繰り返すよりもはるかに多く表と裏を交互に行い、かなりの確実性で次の値を予測することを可能にします(次の値の50%以上の確率)彼らの最後の反対になります)。

数字の繰り返しまたは2桁のシーケンスは、真のランダムな6桁の数字(例:連続する繰り返し数字の41%、どこでも繰り返し数字の85%)では非常に一般的であり、「ランダム」では非常に珍しい6あなたが人間に思いつくように頼む桁数.

13
thomasrutter