![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 012 Pomógł: 109 Dołączył: 26.09.2003 Skąd: nexis.pl Ostrzeżenie: (0%) ![]() ![]() |
Zwykle, dla bezpieczeństwa, trzymamy w bazie danych skrót hasła, utworzony za pomocą md5() bądź sha1(). Z myślą o tęczowych tablicach dopisujemy zwykle dodatkowo tzw. sól, która jest trzymana poza bazą danych, zwykle na serwerze.
Chciałbym jednak zwiększyć bezpieczeństwo również po stronie użytkownika i zastosować mechanizm znany z banków internetowych, czyli odpytywanie użytkownika o wybrane znaki hasła. Aby zastosować taki mechanizm jestem jednak zmuszony zapamiętać każdy znak hasła osobno. Powiedzmy, że w tym celu narzucę maksymalną długość hasła na 16 znaków i stworzę w tabeli bazy danych 16 dodatkowych pól (po 1 dla każdego znaku). Jak ma się jednak w/w sposób do tej sytuacji? Sam skrót to praktycznie żadne zabezpieczenie. Zastosowanie soli już bardziej, ale jest to wciąż bardzo słaby mechanizm. Co zrobić? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To przemyśl co da hasło abababab skoro dla każdej litery jest ta sama sól zawsze. Bo jeśli dobrze zrozumiałem Twoje rozumowanie, to "każdy user ma swój hash i każda litera ma swój hash". W wyniku dostaniemy:
sha1(sól_główna + sól1 + a) sha1(sól_główna + sól2 + b) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól2 + b) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól2 + b) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól2 + b) Sól główna jest stała, a każda litera ma swoją własną sól. Przy czym można wnioskować, że sole dla całego zakresu znaków są stałe, niezależnie od tego u jakiego usera. W moim pomyśle nawet wystąpienie kilkukrotne tej samej litery wprowadziło by różne skróty dla nich w wyniku. Poza tym w takim wypadku jak ja Cię zrozumiałem niepotrzebne jest używanie znaku na końcu, gdyż i tak jego hash jest identyczny. Nie robi więc różnicy czy użyję "sól+jego_znak" czy samo "sól" w funkcji skrótu, gdyż i tak w wyniku dostanę tak czy inaczej przy każdym powtórzeniu ten sam hash. Czy więc użycie 'mambaA' i 'mamba' da coś więcej poza innym nieco hashem. To i tak nieistotne dopóki będzie się za każdym razem dostawać ten sam. Mi bardziej zależy na tym, by algorytm generował inny hash dla 'mamba' w zależności od tego na jakiej pozycji jest litera do weryfikacji, bo może się okazać, że wtedy do funkcji skrótu nie trafi mamba ale 'mbaca' co zmieni już wynik hashowania, mimo że zostały wywołane dla tej samej litery. Zresztą czy zastanawiałeś się nad tym, gdzie przechowywać sole dla zakresu (odpada jeśli sa generowane w locie). Jeśli jednak planowałeś generować dla każdego usera jego własne sole dla całego zakresu to gdzieś też musiałbyś je przechowywać do porównania. EDIT: Pozwól że rozpiszę przykład aaaaaaaa Twój kod: sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) Mój kod: sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_1_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_2_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_3_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_4_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_5_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_6_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_7_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) sha1(sól_główna + sól_generowana_dla_znaku_na_pozycji_8_modulo_długość_ciągu_w_jakiejś_danej_tekst owej) Problemem jest teraz u Ciebie powtarzanie się hashy. U mnie pewne mogą się powtórzyć, ale jest to o wiele mniej prawdopodobne, gdyż musiałoby dojść do sytuacji, że ciąg musiałby mieć na tych samych pozycjach te same znaki. i byłoby to jednoznaczne choćby z ciągiem 'cccccccccccccc'. Ale użycie dowolnego innego jak 'dowolny_ciąg' dałoby te same znaki tylko dla litery 'o'. Choć więc hasło jest z samych literek 'a' to każda z nich niemal ma inny hash po przejściu funkcji ;) Ten post edytował thek 4.09.2009, 13:40:24 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 012 Pomógł: 109 Dołączył: 26.09.2003 Skąd: nexis.pl Ostrzeżenie: (0%) ![]() ![]() |
Twój kod: sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) sha1(sól_główna + sól1 + a) Niestety źle mnie zrozumiałeś. Mam na myśli coś tego typu: Sól systemowa: 6R$fr2Ga Nazwa użytkownika: adam Hasło: abcd1234 Skróty w bazie danych: sha1(6R$fr2Ga + CRu6$wRu + a) sha1(6R$fr2Ga + cuthA3=R + b) sha1(6R$fr2Ga + th$PhE3u + c) sha1(6R$fr2Ga + +RUt*uF2 + d) sha1(6R$fr2Ga + =r9cH6!u + 1) sha1(6R$fr2Ga + F7ecR-ph + 2) sha1(6R$fr2Ga + _EKa73@w + 3) sha1(6R$fr2Ga + p@$VE96u + 4) Nazwa użytkownika: ewa Hasło: abcd1234 (takie samo jak użytkownika "adam") Skróty w bazie danych: sha1(6R$fr2Ga + R$ga@AdU + a) sha1(6R$fr2Ga + 9e-r*sAs + b) sha1(6R$fr2Ga + gE*ekUp7 + c) sha1(6R$fr2Ga + H#wru3at + d) sha1(6R$fr2Ga + z2=U7Huf + 1) sha1(6R$fr2Ga + jeD+ut4C + 2) sha1(6R$fr2Ga + du6*aPag + 3) sha1(6R$fr2Ga + 2?_tE3Ra + 4) Sól systemowa i poszczególne sole będą trzymane po stronie serwera ze skryptami (poza bazą danych). Czy jest możliwość złamania tego? Bo tylko wtedy widzę potrzebę jakichkolwiek dodatkowych kombinacji. Sole mogą, a nawet powinny, być bardziej złożone (> 32 znaków), ale podałem krótsze dla zwiększenia czytelności. Ten post edytował nexis 4.09.2009, 21:32:08 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 8.10.2025 - 01:32 |