Wystarczająco długi, losowy string, by ograniczyć prawdopodobieństwo zgadnięcia

0

Dzień dobry.

Potrzebuję dodać kody do stringa w taki sposób, by user go niechcący nie odgadł. Jak długi musi on być, by prawdopodobieństwo zgadnięcia ograniczyć do minimum oraz, żeby był mniejszy niż np. 100 znaków.

Jak długi string wystarczy? ważne by składał się tylko z liter i cyfr dziesiętnych

Dzięki
M.

2

by prawdopodobieństwo zgadnięcia ograniczyć do minimum

Ile to jest minimum? :-)

Powiązane:

5

Jak długi musi on być, by prawdopodobieństwo zgadnięcia ograniczyć do minimum oraz, żeby był mniejszy niż np. 100 znaków.

Dziewięćdziesiąt dziewięć znaków. Prawdopodobieństwo odgadnięcia stringa jest ściśle malejące z jego długością.

Jak długi string wystarczy?

Komu? Do czego? Jak długo trwa weryfikacja pojedynczej wartości, ilu jednoczesnych atakujących się spodziewasz i z jaką mocą obliczeniową, jak długo chcesz się móc opierać?

0

Dzięki za odpowiedzi!

Chodzi o to, że chcę przepuścić string przez filtr, którego niektóre fragmenty chcę zakodować, żeby je rozkodować jako inne wartości. Jest mi to potrzebne, gdyż parser którego używam, nie rozpoznaje pewnych ciągów i się wywala, jak je widzi. Ale nie wywala się jak je w odpowiedni sposób zakoduję. Jednak nie chcę sytuacji, że user odgadnie kod jednego z fragmentów i w wyniku czego powstanie kolizja nazw i algorytm pójdzie do piachu.

Ale myślę, że jak dam kod długości 50 znaków [a-zA-Z0-9] to będzie ok nieprawdaż? (oczywiście wystarczająco losowy)

0

A nie możesz jakoś pokombinowac z hashowaniem?
https://en.wikipedia.org/wiki/Cryptographic_hash_function

7

Użyj UUID i nie kombinuj.

Ale myślę, że jak dam kod długości 50 znaków [a-zA-Z0-9] to będzie ok nieprawdaż?

Jeden dodatkowy znak podnosi trudność zgadywania 62 razy, bo tyle masz znaków w charsecie. Czyli szansa ze ktoś zgadnie 1 znak to 1:62, że dwa znaki 1:3844 itd. To jest jakieś 6 bitów bezpieczeństwa per znak. Offline bruteforce na zwykłym komputerze w ciągu kilku godzin można by liczyć na 32 bity. Każdy kolejny bit oznacza że czas rośnie 2 razy. Jeśli to zgadywanie wymaga jakiegoś zdalnego requestu to oczywiście możliwości spadają o wiele rzędów wielkości, z trudem może 16 bitów da się tak atakować żeby się udało w czasie kilku godzin.

50-100 znaków to jakiś niewyobrażalny overkill. 21 znaków to już poziom bezpieczeństwa porównywalny z aktualnie stosowanymi szyframi symetrycznymi bo te często maja 128 bitowe klucze.

1

@lion137: jak po prostu zahashuję jakiś tekst, to ktoś może też wygenerować sobie taki hash domyślając się słowa wzorcowego i du*a :P

Ale odpowiem jeszcze @Althorion Myślę, że więcej niż 100 requestów/sek w godzinach 8-24 na sekundę nie będzie. Czyli:

100 * 60 * 60 * 18 == (ok.)  6.5 * 10 ^ 6 req.
-||- * 30 == (ok.) 2 * 10 ^ 8

czyli 200 M req. miesięcznie (myślę, że nie będzie aż tylu, ale żeby nie kombinować jak się pojawią :P )
To daje 24 * 10 ^ 9 req. rocznie. Nawet załóżmy, ale równych rachunków, że 10^12 == 2 ^ 40. Przy czym większość requestów nie będzie wpisywać danych z du*y. Czyli przez rok wyjdzie 16^10 więc

62^50 powinno styknąć :D

1

Znowu coś kombinujesz naokoło. Użyj kodowania, gdzie nie trzeba robić takich obejść. Wiesz jak inne rozwiązania radzą sobie z tym problem, który Ty masz? Stosują znak specjalny i jeśli wystąpi gdzieś w oryginalnym tekście to go też kodują. Nie trzeba się martwić, że użytkownik gdzieś go użyje.

Sprawdź np. url encoding. Np. "🍆%" zakoduje jako "%F0%9F%8D%86%25". A jeśli gryzie się to z Twoim formatem to koduj tylko podzbiór znaków albo coś.

1

Dlaczego nie możesz zrobić takiego UUIDa jak pisze @Shalom?
Ewentualnie generować jakiś hash(SHA512 np) na podstawie konkretniej daty, godziny i jakichś pseudolosowych danych.

@mpaw jaki chcesz rozwiązać problem? Chodzi o tworzenie linków do resetów haseł, aktywacji itp?

Może chcesz w linku przekazać zaszyfrowana wartość, która potem chcesz deszyfrować?
Jeżeli tak, to nie lepiej to zaszyfrować asymetrycznie i potem odszyfrować ten payload?

3

Może chcesz w linku przekazać zaszyfrowana wartość, która potem chcesz deszyfrować?
Jeżeli tak, to nie lepiej to zaszyfrować asymetrycznie i potem odszyfrować ten payload?

Mam nadzieje że nie, bo bardzo trudno coś takiego zrobić "dobrze" i potrzeba użyć jakiegoś Authenticated Encryption i wiedzieć co się robi. To że dostajesz od kogoś zaszyfrowany payload który da się odszyfrować nie oznacza wcale że możesz zaufać tej wiadomości i ze została wygenerowana przez uprawnioną osobę. Wiele algorytmów szyfrowania ma szyfrogramy które da się przewidywalnie modyfikować.

0

Spoko, już sobie poradziłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1