「最強のパスワード」


11

4桁のPINで保護されているアプリを使用していて、アカウントがロックされる前に、ユーザーがログインを5回試行しました。

現在、私の顧客の1人がセキュリティを「強化」し、別のソリューションを提唱したいと考えています。

  • 6桁のPIN
  • いいえ「隣同士に同じ数字」:例:11 3945または39 55 94
  • 「3つの連続する数字」:例:123 654または53 789 3

さて、質問:最も強力なソリューションはどれですか?

4桁はかなり簡単に計算できますが、もう1桁はどのように計算しますか?

ありがとう!

更新

あなたはあなたが求めるものを手に入れます-特に数学を扱うとき:)

だから、私が求めていたのは、両方の数列の組み合わせの数でした。

回答やコメントを読むと、それは本当に問題ではないことが明らかになりました。推測が5つある場合は、1万個と800.000個から選択できます。さらに重要なのは、1234年と誕生日を除外することです。私の状況では、実際にユーザーの誕生日があるので、チェックするものがあります。

素晴らしい議論をありがとう!


4
歴史的な見方をすると、エニグママシンの解読に精通する必要があります。特に、エニグマアルゴリズムはそれ自体への手紙を暗号化することはありません。これは、エンジニアによってより安全になると考えられていましたが、マシンの安全性が大幅に低下するという影響がありました。これは連合国がエニグマを破ることを可能にした多くのステップの1つでした。私は決して暗号化の専門家ではありませんが、一般的には、キースペースをできるだけ大きくする必要があると考えています。
Sycoraxは、モニカを2015

2
これは暗号ではなく、ここにあると思います。
ガン-モニカの復活

2
キャスパー、明確にしてください-あなたは主にそれをセキュリティ問題として懸念していますか(例えば、確率以上のものに関連する考慮事項があります)。ここに収まる)?
Glen_b-2015

3
理論的には-ブルートフォース攻撃のみに焦点を当てている場合-より多くの可能性はより多くのセキュリティを意味するため、同じ数字や3のないランなどの制限は可能性の数を減らし、厳密に弱くなります。ただし、実際には(user777が触れているように)人々はランダムなピンを選択していません。ユーザーが偏執狂よりも怠惰である場合、ユーザーの多くは "000000"や "123456"などのピンを選択する可能性があり、その場合はセキュリティが低下します。
Gregor Thomas

2
OPの意図がまだ明らかではないという理由で、私はこの質問を(一時的に)不明確なものとして閉じることに投票します。@Glen_bの質問に答えてほしいので、私はこれを組み合わせ論/確率の質問として扱うべきか、それともより移行されたものとして扱うべきかを知っています。
Silverfish

回答:


8

統計学者のフォーラムにこの質問の助けを求めたので、統計に基づいた回答を提供します。したがって、ランダムにPINを推測する確率に関心があると想定するのは理にかなっています(ランダムの定義の場合)。

私のアプローチは、制限なしにすべての可能なオプションを列挙してから、無効なオプションを差し引くことです。ただし、これには包含/除外の原則と呼ばれる鋭い角があります。これは、セットから同じものを2度減算したくないという直感的な考えに対応しています。

106000000999999:

AAXXXXAXAAXAAXXXXXAAXXXXXAAXXXXXAA104104A1055×105

ABCXXX

  • 012XXX
  • 123XXX
  • 234XXX
  • 456XXX
  • 789XXX

この時点では、「ラップアラウンド」があるかどうかは不明です。ある場合は、

  • 890XXX
  • 901XXX

103XABCXX.

ここで、包含と除外の原則である鋭い角に到達します。6桁のすべてのPINのセットを3つのセットにしました。

A.許可されるPIN B.「隣接する数字」による無効なPIN C.「連続する数字」による無効なPIN

BC|S|=|A||B||C|,|S|=|A||B||C|+|BC|,BCBCBC

これにはいくつかの原因があります。

  • AABCXX
  • ABCXDD

もう少し高度なアプローチでは、基本的な組み合わせの結果とカウントの基本的な定理を利用しますが、読者への技術的な負担が最も少ないため、この方法を選択しました。

1|S|

4桁または6桁のスキームには非常に多くのオプションがあり、5つの異なるランダムな推測でも低いため、「ロックアウトまで5」のしわは明らかに不正アクセスに対するより優れた防御策です。成功の確率。適切な確率の質問の場合、そのような攻撃が成功する確率を計算することが可能です。

ただし、数字のシーケンスの確率以外の要因がPINメカニズムのセキュリティに影響を与える可能性があります。主に、人々はランダムにPINを選択しない傾向があります!たとえば、生年月日、子供のDOB、または同様に個人的に関連する番号をPINとして使用する人もいます。攻撃者がユーザーのDOBを知っている場合、それはおそらくユーザーが最初に試みることの1つになります。したがって、特定のユーザーにとって、いくつかの組み合わせは他のものよりも可能性が高いかもしれません。

*リストするシーケンスは厳密に増加しており、「3つの連続する数値」と言うと、増加と減少の両方が明確ではありません。


1

閉じた数式を取得するのは複雑に見えます。ただし、それらを列挙するのは非常に簡単です。568 9162番目のソリューションには、考えられるコードがあります。これは、4桁のPINコードを使用するソリューションの数よりも大きいです。それらを列挙するコードは以下のとおりです。最適化されていませんが、実行に数秒しかかかりません。

注意。シーケンスは昇順である必要があると想定しました(これはで簡単に変更できますthree_running

N = 999999

candidates = range(N)

def same_consecutive_digits(x):
    x_string = str(x).zfill(6)
    for i in range(1,len(x_string)):
        if x_string[i] == x_string[i-1]:
            return True
    return False

def three_running(x):
    x_string = str(x).zfill(6)
    for i in range(2,len(x_string)):
        if int(x_string[i]) == int(x_string[i-1]) + 1 and int(x_string[i-1]) == int(x_string[i-2]) + 1:
            return True
    return False

def valid(x):
    return not same_consecutive_digits(x) and not three_running(x)

assert(same_consecutive_digits(88555))
assert(same_consecutive_digits(123))
assert(not same_consecutive_digits(852123))
assert(three_running(123456))
assert(not three_running(4587))
assert(valid(134679))
assert(not valid(123894))
assert(not valid(111111))
assert(not valid(151178))
assert(valid("031278"))

accepted = [i for i in range(N) if valid(i)]
print(len(accepted))

説明ではなくコードで暗黙的に示されているのは、PINが数字の「0」で始まることは決してないという前提です。これは通常、PINやパスワードには当てはまりません。そのようなゼロを考慮した正解は568,916です。ただし、関連する回答では、この制約された問題でのPINへの攻撃は、制約を利用することではるかに効率的になる可能性があり、この可能性の単なる列挙は、質問へのコメントで指摘されているシステム。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.