Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kilka znaków zamiast całego hasła - jak to działa?
NetBeans
post
Post #1





Grupa: Zarejestrowani
Postów: 56
Pomógł: 4
Dołączył: 18.01.2012

Ostrzeżenie: (0%)
-----


Cześć.
Pewnie większość z Was kojarzy metody logowania na stronach banków. Jest to wykonane w ten sposób, że musimy podać tylko kilka znaków naszego hasła (reszta jest zablokowana, tak jakby już były wpisane). Zastanawiam się w jaki sposób to działa. Zakładam, że hasła są hashowane, więc w jaki sposób porónywane są ciągi, skoro są niekompletne. Nie jest chyba możliwe, że system wie jakie znaki hasła mamy pod daną cyferką (widoczne na obrazku) i uzupełnia ciąg do porównania z hashem. Do tego "szare" pola są generowane losowo. Interesuje mnie zasada działania, nie proszę o żaden gotowy kod etc.
Pozdrawiam. (IMG:style_emoticons/default/smile.gif)

Wspomniany obrazek:
(IMG:http://i.imgur.com/Dbb16Z6.png)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Koledzy, wtrącę się i ja, bo kiedyś myślałem o takim rozwiązaniu. Wybaczcie, ale trochę kupy nie trzyma się Wasze rozumowanie. Najpierw napiszę dlaczego, a później opiszę moje rozumowanie.

1. Hashowanie pojedynczych znaków

1.a. Wspólna sól trzymana w kodzie.
Przypadek trywialny, bo sami sobie robimy szyfr słownikowy. Każdemu znakowi będzie w bazie odpowiadał jeden, taki sam ciąg. Mało tego - po znalezieniu soli dla jednego znaku znamy ją globalnie. Czas złamania - kilka minut na znak w zależności od długości soli. Ewentualnie można polecieć algorytmem statystycznym, jak to robili już w czasie II wojny światowej (IMG:style_emoticons/default/wink.gif)

1.b. Każdy znak solony inną solą.
W tym przypadku nie ma innej opcji jak trzymanie każdej soli w bazie. Przypadek jeszcze łatwiejszy niż poprzedni, bo niewiadomą jest już tylko szukany znak. Ile milisekund potrzebowałby w miarę szybki komputer na wygenerowanie n hashy (n - liczba dostępnych znaków)?

1.c. Sól generowana dynamicznie w kodzie dla każdego usera.
Rozwiązanie najlepsze z tych 3. Ale domyślam się, że po złamaniu pierwszych 1000 haseł bez większego problemu można znaleźć klucz, który określa w jaki sposób generowana jest ta sól. Bo oczywiście nie może to być losowanie, bo za każdym razem dla danego usera musi być wygenerowana ta sama sól.


2. Moje rozumowanie

2.a Generowanie n kombinacji
Jak dla mnie najbezpieczniejszym rozwiązaniem byłoby wygenerowanie n kombinacji dla danego hasła. Załóżmy dla uproszczenia, że hasło składa się z 5 znaków, a user musi wpisać co najmniej 3. Daje to 26 kombinacji (poprawcie mnie jeśli się mylę). Zapisujemy każdą z nich w bazie jako posolony hash. Przy każdym rekordzie zapisujemy które znaki są w nim zawarte i zapisujemy też sól. Przed logowaniem system wybiera z bazy opcję hasła (które znaki trzeba wpisać), a później hashuje hasło i porównuje z informacją w bazie, podobnie jak przy "normalnym" logowaniu.
Wady:
- przy dłuższych hasłach hashy będzie dosyć sporo
- przy algorytmach lepszych niż md5/sha1, czas generowania kombinacji może być dosyć długi (kilka/naście sekund?)
- trochę skomplikowana implementacja generowania kombinacji
Zalety:
- kombinacje generowane tylko podczas zakładania konta i zmiany hasła
- IMO całkiem bezpieczne rozwiązanie

Ten post edytował sowiq 17.07.2013, 08:29:24
Go to the top of the page
+Quote Post
gitbejbe
post
Post #3





Grupa: Zarejestrowani
Postów: 516
Pomógł: 63
Dołączył: 27.08.2012

Ostrzeżenie: (0%)
-----


@sowiq

tak przeczytałem, Twój post również. Stwierdzenie w pkt.1b, że losowy token dla każdego hasła jest jeszcze łatwiejszy do złamania od stałego, sparaliżowało mi chęć odpisania na to do końca dnia. Co do Twojego pomysłu w pkt 2a, nie wiem, nie rozumiem, czytam któryś raz i jedyne czego jestem pewien to to, że sam wymieniłeś więcej wad niż zalet takiego rozwiązania ; )

Jak dla mnie, najprościej i najbezpieczniej jest dla każdego znaku w haśle zrobić losowy token, przemieszać go ze stałym tokenem (+ jakieś inne dowolne stałe, np data założenia konta - ba,można zrobic i tak, że dla znaku 1 bedzie to data rejestracji, dla 2 będzie to login, dla 3 jeszcze coś innego). dodatkowo wszystkie te zaszyfrowane znaki połączyć jako całość i znowu przemieszać. Przy logowaniu - 3 nieudane próby i captcha po 10 próbach ban. Wątpie aby autor wątku pisał system bankowy. Jeśli chce mieć niespotykane logowanie to fajnie, ale nie popadajmy w paranoje. To w zupełności wystarczy
Go to the top of the page
+Quote Post
sowiq
post
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@gitbejbe,
Na początku zaznaczę dla pewności, że pisałem o zapisywaniu każdej litery hasła oddzielnie, jako osobny hash.

Cytat(gitbejbe @ 18.07.2013, 07:33:51 ) *
Stwierdzenie w pkt.1b, że losowy token dla każdego hasła jest jeszcze łatwiejszy do złamania od stałego, sparaliżowało mi chęć odpisania na to do końca dnia

Bardzo chętnie dowiem się dlaczego. Jak dla mnie, jeśli token jest losowy i zapisany w bazie (nie generowany z niczego - ten przypadek opisałem w punkcie 1.c), to masz wręcz trywialną sytuację. Do sprawdzenia wszystkie jednoznakowe możliwości dla jednego hasha. Na standardowej klawiaturze możesz wprowadzić 98 znaków, więc na złamanie każdego hasha potrzeba max 98 prób. IMO średnia będzie oscylowała w okolicach 50.
Jeśli coś opisałem nielogicznie/niejasno to bardzo chętnie wyjaśnię Ci mój punk widzenia.

Cytat(gitbejbe @ 18.07.2013, 07:33:51 ) *
Co do Twojego pomysłu w pkt 2a, nie wiem, nie rozumiem, czytam któryś raz i jedyne czego jestem pewien to to, że sam wymieniłeś więcej wad niż zalet takiego rozwiązania ; )

Opisałem to trochę dokładniej tutaj: http://forum.php.pl/index.php?s=&showt...t&p=1056210 Sorry, źle przeczytałem.
Jeśli bierzesz pod uwagę liczbę wad i zalet, a nie zwracasz uwagi jakie one są, to sorry. Wady to skomplikowana implementacja i czas generowania, a zalety to (przynajmniej moim zdaniem) bezpieczeństwo. Jeśli komuś bardzo zależy na bezpieczeństwie, to ta zaleta przebija wszystkie wady. Czaisz?

Wytłumaczę to na przykładzie.
Załóżmy, że masz 5-znakowe hasło: abcde
Załóżmy, że musisz wpisać co najmniej 3 znaki hasła przy logowaniu. Wobec tego będą takie kombinacje ciągu przychodzącego od usera:
Kod
1. abcde
2. _bcde
3. a_cde
4. ab_de
5. abc_e
6. abcd_
7. __cde
8. _b_de
8. _bc_e
...
26. abc__

Dla każdej z takich kombinacji tworzysz w bazie hash (oczywiście dla 20-znakowego hasła, z którego musisz wpisać co najmniej 10 znaków, kombinacje nie będą tak trywialne, ale też będzie ich więcej). Dzięki temu złamać pojedynczy hash nie będzie tak łatwo (duża ilość znaków szukanego ciągu), każdy hash będzie miał swoją losową sól zapisaną w bazie. O wadach i zaletach pisałem już wcześniej.

Cytat(gitbejbe @ 18.07.2013, 07:33:51 ) *
Jak dla mnie, najprościej i najbezpieczniej jest dla każdego znaku w haśle zrobić losowy token, przemieszać go ze stałym tokenem (+ jakieś inne dowolne stałe, np data założenia konta - ba,można zrobic i tak, że dla znaku 1 bedzie to data rejestracji, dla 2 będzie to login, dla 3 jeszcze coś innego)

To jest metoda, którą opisałem w punkcie 1.c.

Cytat(gitbejbe @ 18.07.2013, 07:33:51 ) *
dodatkowo wszystkie te zaszyfrowane znaki połączyć jako całość i znowu przemieszać.

Tutaj rozwaliłeś mnie po raz pierwszy. Pomieszaj, pomieszaj i poproś swój skrypt logujący, żeby później to magicznie odmieszał i sprawdził poprawność wpisanych literek. Tak jak pisałem już wcześniej - zaciemnianie != poprawa bezpieczeństwa.

Cytat(gitbejbe @ 18.07.2013, 07:33:51 ) *
Wątpie aby autor wątku pisał system bankowy. Jeśli chce mieć niespotykane logowanie to fajnie, ale nie popadajmy w paranoje. To w zupełności wystarczy

Ale to nie ma nic do rzeczy. Dyskutujemy tutaj na temat jak najbezpieczniej rozwiązać problem. Może ktoś z nas w przyszłości będzie robił podobne logowanie, gdzie nacisk będzie położony na bezpieczeństwo i będzie musiał zmierzyć się z tym?

Cytat(gitbejbe @ 18.07.2013, 07:33:51 ) *
Przy logowaniu - 3 nieudane próby i captcha po 10 próbach ban.

Najlepsze zostawiłem sobie na koniec. Wyjaśnij mi, proszę, co ma captcha i ban bo łamania haseł w wykradzionej bazie danych, a stawiam browara.

Ten post edytował sowiq 18.07.2013, 08:34:33
Go to the top of the page
+Quote Post

Posty w temacie
- NetBeans   Kilka znaków zamiast całego hasła - jak to działa?   13.07.2013, 11:18:13
- - b4rt3kk   Rzeczywiście, hasło na pewno nie jest przechowywan...   13.07.2013, 11:42:58
- - NetBeans   Tak, ale hashe dla każdego znaku z tablicy ASCII (...   13.07.2013, 11:56:41
|- - b4rt3kk   Cytat(NetBeans @ 13.07.2013, 12:56:41...   13.07.2013, 13:16:55
- - pyro   Hasło: przykładowo X znaków czyli X wpisów do tab...   13.07.2013, 12:09:41
- - adamantd   Ciekawe A może tak. 1. rejestrujesz się do system...   13.07.2013, 12:12:40
- - NetBeans   Faktycznie, jedynie soląc hashe znaków byłoby to w...   13.07.2013, 14:36:35
- - gitbejbe   tak jak piszecie powyżej. Systemy bankowe mają t...   14.07.2013, 10:45:00
- - pyro   Warto dodać, że sól powinna być wyłącznie zahardco...   16.07.2013, 10:15:14
|- - drPayton   Cytat(pyro @ 16.07.2013, 11:15:14 ) W...   16.07.2013, 20:55:04
|- - pyro   Cytat(drPayton @ 16.07.2013, 21:55:04...   17.07.2013, 07:12:25
|- - drPayton   Cytat(pyro @ 17.07.2013, 08:12:25 ) N...   17.07.2013, 09:19:18
- - Sephirus   Włączę się bo widzę pewną potencjalną lukę. Przy t...   17.07.2013, 07:38:40
- - pyro   Cześć. Mając trochę doświadczenie w temacie racze...   17.07.2013, 08:09:00
- - b4rt3kk   Jakby solą był np. login użytkownika (lub kilka zn...   17.07.2013, 08:14:24
- - Sephirus   @pyro Wyobraź sobie, że wyobrażam (zauważ, że mó...   17.07.2013, 08:16:25
- - pyro   @Sephirus, według Twojego toku myślenia jak włamyw...   17.07.2013, 08:22:14
- - sowiq   Koledzy, wtrącę się i ja, bo kiedyś myślałem o tak...   17.07.2013, 08:23:57
|- - pyro   Cytat(sowiq @ 17.07.2013, 09:23:57 ) ...   17.07.2013, 08:31:43
||- - sowiq   Cytat(pyro @ 17.07.2013, 09:31:43 ) C...   17.07.2013, 08:33:35
|- - gitbejbe   @sowiq tak przeczytałem, Twój post również. Stwie...   18.07.2013, 06:33:51
|- - sowiq   @gitbejbe, Na początku zaznaczę dla pewności, że p...   18.07.2013, 08:23:16
- - Sephirus   @pyro - nie mam zamiaru się z Tobą kłócić o to czy...   17.07.2013, 08:32:50
- - pyro   @Sephirus, chyba należy doprecyzować o jakim przyp...   17.07.2013, 08:41:13
- - Sephirus   @up Masz rację, że mając taki dostęp można zrobić...   17.07.2013, 08:48:55
- - sowiq   @pyro, rzeczy, o których pisałem, tyczą się kodowa...   17.07.2013, 08:50:37
- - buliq   Algorytm może tworzyć zasolony (każdy znak, inna s...   17.07.2013, 08:59:25
|- - sowiq   Ucinanie hasha to osłabianie szyfrowania - większa...   17.07.2013, 09:07:36
|- - buliq   Cytat(sowiq @ 17.07.2013, 10:07:36 ) ...   17.07.2013, 09:41:55
- - pyro   Cytat(sowiq @ 17.07.2013, 09:50:37 ) ...   17.07.2013, 09:43:09
|- - sowiq   Cytat(pyro @ 17.07.2013, 10:43:09 ) C...   17.07.2013, 09:52:25
||- - pyro   Przecież mówimy dokładnie o tym samym. Cytat(sow...   17.07.2013, 09:55:42
|- - drPayton   Cytat(pyro @ 17.07.2013, 10:43:09 ) (...   17.07.2013, 21:21:55
- - redeemer   Pozwólcie, że wtrącę moje trzy grosze na temat ...   17.07.2013, 09:56:42
|- - pyro   Cytat(redeemer @ 17.07.2013, 10:56:42...   17.07.2013, 10:00:15
- - redeemer   @pyro: chodziło mi o to, że ktoś wcześniej napisał...   17.07.2013, 10:15:09
- - pyro   Sorry miałem na myśli "przed i po", ale ...   17.07.2013, 10:18:27
- - gitbejbe   nie wiem nad czym się tutaj rozczulać. Dobrze prze...   17.07.2013, 11:46:04
- - sowiq   @gitbejbe, przeczytałeś wątek? Tu nie chodzi o tak...   17.07.2013, 12:23:38
- - NetBeans   Nie piszę ani systemu bankowego, ani nie mam zamia...   18.07.2013, 08:49:10
- - redeemer   @pyro: Podałem tylko przykład, że pobrana sól z ba...   18.07.2013, 09:58:43
- - gitbejbe   CytatBardzo chętnie dowiem się dlaczego nadal nie...   18.07.2013, 11:04:09
- - sowiq   Cofnij się o jeden post i zerknij w linka, którego...   18.07.2013, 11:40:34
- - Crozin   @NetBeans: Przede wszystkim nie powinieneś w ogóle...   18.07.2013, 12:23:31
|- - phpion   Cytat(Crozin @ 18.07.2013, 13:23:31 )...   18.07.2013, 12:28:43
- - Crozin   CytatW przypadku zainstalowania jakiegoś keylogger...   18.07.2013, 12:42:56
- - Damonsson   A co z czymś takim: Hasło: alamakota Hash hasła...   18.07.2013, 12:48:35
|- - redeemer   Cytat(Damonsson @ 18.07.2013, 13:48:3...   18.07.2013, 12:52:09
- - nospor   CytatSkrypt PHP, przekazujący litery z pozycjami, ...   18.07.2013, 12:51:43
- - freemp3   Cytat(Crozin @ 18.07.2013, 13:42:56 )...   18.07.2013, 12:56:32
- - phpion   @Damonsson: Pomysł moim zdaniem chybiony właśnie z...   18.07.2013, 12:57:33
- - Damonsson   Przy 0 znakach ok, szukałby w nieskończoność pewni...   18.07.2013, 13:00:54
|- - redeemer   Cytat(Damonsson @ 18.07.2013, 14:00:5...   18.07.2013, 13:15:16
- - nospor   @Damonsson ale zrozum, ze Twoim sposobem Ty napraw...   18.07.2013, 13:03:10
- - NetBeans   Również zastanawiałem się nad bezpieczeństwem taki...   18.07.2013, 13:10:48
- - Damonsson   No to mój pomysł można włożyć między książki fanta...   18.07.2013, 13:27:20
- - Crozin   CytatPrzy okazji, algorytmy dostarczane przez funk...   18.07.2013, 13:30:09
- - freemp3   CytatNie chce mi się wierzyć, że banki trzymają ha...   18.07.2013, 13:54:33
- - NetBeans   No dobra, przekonaliście mnie, ale co z tą solą, o...   18.07.2013, 14:03:01


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 00:43