„Najsilniejsze hasło”

11

Mam aplikację, która jest chroniona czterocyfrowym kodem PIN, a użytkownik otrzymał pięć prób zalogowania się przed zablokowaniem konta.

Teraz jeden z moich klientów chce „wzmocnić” bezpieczeństwo i opowiedzieć się za innym rozwiązaniem:

  • sześciocyfrowy kod PIN
  • NIE „ta sama cyfra obok siebie”: np .: 11 3945 lub 39 55 94
  • NIE „trzykrotne liczby”: np .: 123 654 lub 53 789 3

Teraz pytanie: które rozwiązanie jest najsilniejsze?

Mogę obliczyć czterocyfrowe dość łatwo, ale jak obliczyć drugą?

Dzięki!

Aktualizacja

Dostajesz to, o co prosisz - szczególnie podczas pracy z matematyką :)

Zapytałem więc o liczbę kombinacji dla obu sekwencji liczb.

Po przeczytaniu odpowiedzi i komentarzy stało się dla mnie jasne, że to naprawdę nie ma znaczenia. Jeśli masz 5 domysłów, nie ma znaczenia, czy masz 10.000 lub ~ 800.000 do wyboru. Ważniejsze jest wykluczenie 1234 roku i dnia urodzenia. W mojej sytuacji mam dzień urodzenia użytkowników, więc muszę coś sprawdzić.

Dzięki za wspaniałą dyskusję!

Casper Jensen
źródło
4
Patrząc z perspektywy historycznej, powinieneś zapoznać się z kryptoanalizą maszyny Enigmy. W szczególności algorytm Enigmy nigdy nie szyfrował listu do siebie. Pomysł ten uczynił go bardziej bezpiecznym przez inżynierów, ale spowodował, że maszyna była znacznie mniej bezpieczna. Był to jeden z wielu kroków, które pozwoliły mocom sprzymierzonym złamać zagadkę. W żadnym wypadku nie jestem ekspertem w dziedzinie kryptografii, ale ogólna koncepcja jest taka, że ​​chcesz, aby twoja przestrzeń na klucze była jak największa.
Sycorax mówi Przywróć Monikę
2
Myślę, że to należy do kryptografii , nie tutaj.
gung - Przywróć Monikę
2
Casper, proszę wyjaśnij - czy martwisz się głównie tym, że jest to kwestia bezpieczeństwa (np. Istnieją względy związane z czymś więcej niż tylko prawdopodobieństwem), w którym to przypadku może być lepiej dopasowane gdzie indziej - czy też zadajesz pytanie dotyczące przede wszystkim prawdopodobieństwa (które pasuje tutaj)?
Glen_b
3
Teoretycznie --- jeśli koncentrujesz się wyłącznie na atakach siłowych --- więcej możliwości oznacza większe bezpieczeństwo, więc ograniczenia, takie jak brak tej samej cyfry lub brak 3, zmniejszają liczbę możliwości, dlatego są one znacznie słabsze. Jednak praktycznie (jak dotyka user777) ludzie nie wybierają losowych pinów. Jeśli użytkownicy są bardziej leniwi niż paranoiczni, wielu z nich może wybrać piny, takie jak „000000” lub „123456”, co powoduje, że rzeczy stają się mniej bezpieczne.
Gregor Thomas
2
Głosuję za (tymczasowym) zamknięciem tego pytania jako niejasne, ponieważ intencje PO nie są jeszcze oczywiste. Naprawdę wolałbym zobaczyć odpowiedź na pytanie @ Glen_b, więc wiemy, czy należy to potraktować jako pytanie kombinatoryki / prawdopodobieństwa, czy jako coś, co lepiej migrować.
Silverfish,

Odpowiedzi:

8

Poprosiłeś forum statystyk o pomoc w tym pytaniu, więc udzielę odpowiedzi opartej na statystykach. Dlatego rozsądnie jest założyć, że interesuje Cię prawdopodobieństwo losowego odgadnięcia numeru PIN (w przypadku definicji losowej), ale to w większym stopniu dotyczy pytania niż podano.

Moje podejście polega na wyliczeniu wszystkich możliwych opcji bez ograniczania, a następnie odjęciu pustych opcji. Ma to jednak ostry róg, zwany zasadą włączenia-wykluczenia, co odpowiada intuicyjnemu pomysłowi, że nie chcesz odejmować tego samego od zestawu dwukrotnie!

106000000999999:

ZAZAXXXXZAXZAZAXZAZAXXXXXZAZAXXXXXZAZAXXXXXZAZA104104ZA1055×105

ZAbdoXXX

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

i w tym momencie nie jest jasne, czy istnieje „zawijanie się”. Jeśli tak, uwzględniamy również

  • 890XXX
  • 901XXX

103)XZAbdoXX.

Teraz dochodzimy do ostrego rogu, którym jest zasada włączenia-wykluczenia. Zrobiliśmy zestaw wszystkich sześciocyfrowych PIN-ów w trzy zestawy:

A. Dopuszczalne kody PIN B. Nieważne kody PIN z powodu „sąsiadujących cyfr” C. Nieważne kody PIN z powodu „kolejnych cyfr”

bdo|S.|=|ZA|-|b|-|do|,|S.|=|ZA|-|b|-|do|+|bdo|,bdobdobdo

Może to nastąpić na kilka sposobów:

  • ZAZAbdoXX
  • ZAbdoXrere

Nieco bardziej zaawansowane podejścia wykorzystałyby podstawowe wyniki kombinatoryczne i fundamentalne twierdzenie o liczeniu, ale wybrałem tę drogę, ponieważ stanowi ona najmniejsze obciążenie techniczne dla czytelnika.

1|S.|

Zmarszczka „pięć do blokady” zdecydowanie lepiej chroni przed nieautoryzowanym dostępem, ponieważ w schemacie 4-cyfrowym lub 6-cyfrowym istnieje bardzo duża liczba opcji, a nawet pięć różnych losowych przypuszczeń ma niski prawdopodobieństwo sukcesu. W przypadku dobrze postawionego pytania dotyczącego prawdopodobieństwa możliwe jest obliczenie prawdopodobieństwa powodzenia takiego ataku.

Ale inne czynniki niż prawdopodobieństwo sekwencji numerów mogą mieć wpływ na bezpieczeństwo mechanizmu PIN. Przede wszystkim ludzie nie wybierają PIN-ów losowo! Na przykład niektóre osoby używają daty urodzenia lub DOB dzieci lub innego podobnego numeru osobowego jako numeru PIN. Jeśli atakujący zna DOB użytkownika, prawdopodobnie będzie to jedna z pierwszych rzeczy, które spróbuje. Tak więc dla konkretnego użytkownika niektóre kombinacje mogą być bardziej prawdopodobne niż inne.

* Sekwencje, które wymieniasz, ściśle się zwiększają i nie jest jasne, czy zwiększają się, czy maleją, gdy mówisz „liczba trzyprzestrzeniowa”.

Sycorax mówi Przywróć Monikę
źródło
1

Uzyskanie zamkniętej formuły wydaje się skomplikowane. Jednak ich wyliczenie jest dość łatwe. Możliwe są 568 916kody dla drugiego rozwiązania. Który jest większy niż liczba rozwiązań z czterocyfrowym kodem PIN. Kod do ich wyliczenia znajduje się poniżej. Chociaż nie jest zoptymalizowany, jego uruchomienie zajmuje tylko kilka sekund.

Uwaga. Zakładałem, że sekwencja musi być w porządku rosnącym (który można łatwo modyfikować 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))
RUser4512
źródło
Domniemane w kodzie, ale nie w twoim opisie, jest założenie, że PIN nigdy nie rozpocznie się cyfrą „0”. Zazwyczaj nie dotyczy to PIN-ów ani haseł. Prawidłowa odpowiedź, uwzględniająca takie zera, to 568,916. Pamiętajmy jednak, że odpowiednia odpowiedź uznałaby, że ataki na PIN w tym ograniczonym problemie mogą być znacznie wydajniejsze poprzez wykorzystanie ograniczeń, co oznacza, że ​​samo wyliczenie możliwości nie odzwierciedla odpowiednio „siły” system, jak wskazano w komentarzach do pytania.
whuber