Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]Szyfrowanie hasła solą
Barcelona
post 27.12.2011, 06:42:56
Post #1





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


Witam, krążę właśnie nad zabezpieczeniem mojej strony za pomocą szyfrowania haseł solą. Dużo się o niej wspomina, jakie ma wady i zalety, ale nigdzie konkretnie nie znalazłem jakichś porad w jaki sposób mogę zastosować to szyfrowanie.
Znalazłem skrypt na openwall, pobrałem go razem z dokumentacją, ale jest ona tylko i wyłącznie w języku eng. Dogadać to się dogadam, ale czytać to już nie za bardzo wstydnis.gif
Znajdzie się jakaś dobra dusza, która pomoże mi z tym problemem.

P.S. Aktualnie szyfruje hasła za pomocą md5. Czytałem że na dzień dzisiejszy nie jest to dobre zabezpieczenie (brutal force i te sprawy), jednak pomyślałem żeby przy logowaniu zastosować recaptcha od google. Myślę że w jakiś sposób zatrzymało by to próbę b-f.

Drugim moim pomysłem jest zrobienie warunków. Jeżeli hasło zaczyna się na np. literkę na to ma szyfrować za pomocą md5, a na przykład jak zaczyna się na b to już za pomocą SH1. Wiem że jest to łopatologiczne rozwiązanie, ale myślę że było by skuteczne smile.gif

To na początek wrzuce przykładowy skrypt logowania
  1. $login = mysql_real_escape_string(trim($_POST['login']));
  2. $haslo = mysql_real_escape_string(trim($_POST['haslo']));
  3. $adres = $_SESSION["adres"];
  4.  
  5. if (isset($login) && $login=="") { $blad++;
  6. $komunikat .= "Login nie został podany!<br />";
  7. }
  8. if (isset($login)) {
  9. $wynik=mysql_query("SELECT * FROM logowanie WHERE login='$login'");
  10. if (mysql_num_rows($wynik)==0) { $blad++;
  11. $komunikat .= "Login <b>$login</b> nie widnieje w naszej bazie! <br />";
  12. }
  13. }
  14. if (isset($haslo) && $haslo=="") { $blad++;
  15. $komunikat .= "Hasło nie zostało podane!<br />";
  16. }
  17. if (isset($haslo)) {
  18. $haslo_spr = md5($haslo);
  19. $wynik=mysql_query("SELECT * FROM logowanie WHERE login='$login' AND haslo='$haslo_spr'");
  20. if (mysql_num_rows($wynik)==0) { $blad++;
  21. $komunikat .= "Hasło nie jest prawidłowe! <br />";
  22. }
  23. }
  24. if ($blad>0) {
  25. echo "<div class='error'>".$komunikat."</div><br/>";
  26. }


Pozdrawiam
Go to the top of the page
+Quote Post
mortus
post 27.12.2011, 08:15:56
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Sól to przeważnie ciąg znaków dopisywany do hasła. Sam decydujesz, czy sól dopiszesz do hasła już zakodowanego i później zakodujesz je ponownie, czy dopiszesz ją do do hasła podanego przez użytkownika i zakodujesz jednokrotnie. Sól może być wspólna dla wszystkich użytkowników, a może być też unikalna dla każdego z osobna i wtedy przechowujesz ją w bazie danych obok pozostałych danych do logowania.
Zamiast md5 używaj sha1.
Nie powinieneś sprawdzać, czy pierwszym znakiem hasła jest cyfra, czy litera, a tym bardziej jaka to litera, czy cyfra - hasło to prywatna sprawa użytkownika.
Go to the top of the page
+Quote Post
Barcelona
post 27.12.2011, 10:57:15
Post #3





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


Czyli nie ma jednego genialnego skryptu, który będzie mi kodował hasła z solą. Muszę użyć tutaj swojej wyobraźni smile.gif

Tylko mam pytanie. Mogę losowo kodować hasła algorytmem md5 bądź sh1. Jednak jak zrobić żeby podczas logowania skrypt wiedział że hasło dla konkretnego loginu zostało zakodowane np. za pomocą md5 a nie sh1.

A dobrym sposobem jest do hasła dołączanie np. początek loginu?
Go to the top of the page
+Quote Post
thek
post 27.12.2011, 11:29:48
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Im bardziej "niestandardowy" skrypt hashujący, tym lepiej. Gdyby był jeden genialny, to by już przestał być genialny, bo pod niego by pisano łamacze wink.gif

Możesz losowo wybierać metodę. Przykładowo gdy ktoś wpisuje login i hasło, sprawdzasz obecność loginu w bazie. Gdy jest, pobierasz rekord i dane z nim związane. Mogą one zawierać informacje o indywidualnej soli, typie algorytmu hashującego czy wszelkich ustawionych dla danego konta rzeczach niestandardowych. Na ich podstawie sobie ustawiasz co idzie do algorytmu hashującego i jego wyjście porównujesz z hashem zapisanym w bazie.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Sephirus
post 27.12.2011, 12:33:58
Post #5





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Trzymanie haseł w bazie w formie zaszyfrowanej ma służyć temu by w razie wycieku rekordów nie znane było hasło oraz po to by nie wykorzystywać takiego hasła w innych serwisach (przy założeniu, że użytkownik ma takie samo hasło na przykład na poczcie, w banku i w naszym portalu znając jego hasło można nieźle namieszać).

Używanie "soli" jest jak najbardziej wskazane jak i korzystanie z dłuższego sha1. Ale czy jest sens w przechowywaniu w bazie w rekordzie user'a danych dotyczących "soli" albo jej samej? To w sumie nic nie daje poza tym, że podpowiada włamywaczowi jak łamać hasło.

Ja zawsze trzymam SALT gdzieś głęboko w kodzie - wszędzie jest jednakowy i nie za krótki (przynajmniej z 256 znaków).

Zastanówmy się nad taką sytuacją w 3 podejściach:

1. Bez soli

Ktoś zdobywa hasło usera z bazy. User ma hasło numeryczne na przykład 123456 - przelecenie przez wszystkie kombinacje numeryczne md5 lub sha1 nie trwa tak strasznie długo - pyk - mamy hasło

2. Z solą w bazie

Ktoś zdobywa hasło usera i salt usera - ta sama opcja hasło nuemryczne - do każdego dodajemy salt przed lub za i testujemy - trochę dłużej to potrwa ale i tak pewnie znajdziemy to hasło.

3. Z solą poza bazą

Ktoś zdobywa hasło usera i.... no właśnie i co? smile.gif Może próbować, kombinować a i tak nic mu po tym - jeśli salt jest odpowiednio długi to małe szanse są na to by kiedykolwiek zdobyć hasło - fartem chyba tongue.gif

Podsumowując IMHO nie ma sensu bawić się w przypiswanie saltów indywidualnych dla userów, rotacji sha1/md5... wystarczy sha1, mocny i dobrze ukryty salt i po srpawie wink.gif

I popieram @Thek'a - własny algorytm (przemyślany) to też dobre rozwiązanie wink.gif

Ten post edytował Sephirus 27.12.2011, 12:36:11


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Barcelona
post 27.12.2011, 12:44:06
Post #6





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


Czyli tutaj już muszę użyć swojej kreatywności smile.gif Ale jestem właśnie tego samego zdania co Sephirus że lepiej nie trzymać soli w bazie bo później będzie problem jak ktoś dostanie się do bazy.

A co powiecie na ten pomysł z recaptcha ?
Go to the top of the page
+Quote Post
thek
post 27.12.2011, 13:05:25
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




@Sephirus... SALT jedynie w bazie to za mało. Najlepiej mieć zarówno salt indywidulany dla usera i jeden ogólny dla serwisu a stosować oba jednocześnie. Czemu? Gdy Ci podwędzą kod serwisu to znają SALT hasła z serwisu i algorytm, ale nie znają soli indywidualnych, więc hasła są teoretycznie dalej trudne do ustalenia. Jeśli podwędzą bazę, to nie znają ani algorytmu, ani hasha serwisu, więc też zgaduj-zgadula nadal. Muszą mieć oba te komponenty naraz, aby ustalić hasła, a i tak dla każdego usera musza one być indywidualnie z użyciem "rainbow tables" (o brute force zapomnij wink.gif ) odczytane. Im bardziej przemyślany algorytm z uzyciem obu soli, tym utrudnienia większe, ponieważ trzeba iść "od tyłu" i porównywać z kolejnymi etapami. Odczyt hasha z poziomu tęczowych tablic da Ci bowiem pulę wyników, którą teraz musisz analizować. A że użyjesz przypuśćmy 2-etapowego hashowania, gdzie na każdym etapie uzyjesz innego algorytmu lub będzie on modyfikowany ustawieniami to utrudniasz w jakiś tam sposób łamanie. Jeśli jesteś super paranoikiem, to zawsze jeszcze możesz jakiś element, konieczny do uzyskania danych wejściowych dla algorytmu hashującego, przenieść na serwer trzeci, który zwraca pewne elementy po SOAPie dla uwierzytelnionego i rozpoznawanego między innymi po IP - serwera wink.gif Wtedy masz jako utrudnienia aż 3 elementy konieczne do uzyskania/posiadania:
a) kod serwisu,
cool.gif baza serwisu
c) autoryzacja dla serwera zewnętrznego.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Sephirus
post 27.12.2011, 13:30:09
Post #8





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


@up no tak tak - absolutnie masz rację - to jeszcze lepsze - ja pisałem jedynie o tym by nie dawać salta "tylko" w bazie tongue.gif To co napisałeś ma spory sens - podwójne zabezpieczenie smile.gif co do zewnętrznego salta na serwerze zewnętrznym to faktycznie lekkie przegięcie ale w niektórych sytuacjach... może smile.gif

Czyli dochodzimy do wniosku:

1. salt indywidualny (dla każdego usera w bazie)
2. salt globalny (kod)

szyfrogram to efekt hashowania hasła poprzez 1 a następnie poprzez 2 wink.gif

IMHO ReCaptcha - to zuo - zmusza ludzi do robienia czegoś czego nie chcą i zajmuje wbrew pozorom sporo czasu :/ Dodatkowo poza właśnie google'owską reCaptchą to reszta jest już pozłamywana. - Są inne sposoby na spam, brute force itd.


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Barcelona
post 27.12.2011, 19:35:57
Post #9





Grupa: Zarejestrowani
Postów: 322
Pomógł: 15
Dołączył: 29.01.2010

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


Ok, to recaptcha zostawię w spokoju, skupie się lepiej na dobrym algorytmie kodowania hasła. Dziękuje za informację i temat do zamknięcia.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2025 - 06:52