Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Gdy zwykły hash to mało

O przechowywaniu haseł przez Allegro już pisałem, ale to nie wyjątek również także Sony wpadkę z wyciekiem danych miało. Wstyd i hańba nie dbać o nasze dane.
Wielkie marki nie dbają o bezpieczeństwo naszych danych, ale to nie oznacza abyśmy my postępowali tak samo.
Przedstawię kilka uwag i wskazówek odnośnie bezpiecznego przechowywania danych w bazach danych.

Najpopularniejszym "zestawem" do tworzenia stron www jest PHP+MySQL - zatem tego będę się trzymał w tym wpisie.

Hash

Polega na jednostronnym szyfrowaniu(zakodowaniu, zwą jak zwą) danych ale w przeciwieństwie od tradycyjnego szyfrowania, proces ten nie jest odwracalny.

r   e   k   l   a   m   a
No okej będę zatem hashował i będę bezpieczny - mówi Jasio.
Nie nie nie! - mówię ja.

Podstawowy błąd - MD5

Ooo yeah!

$hash = md5("hasło");

Uznanie tego za bezpieczne rozwiązanie to prawda. Hejtujcie mnie ale tak. Jest to o wiele bezpieczniejsze przechowywanie haseł niż w formie zwykłego tekstu ;-)
Dobra, dobra koniec żartów, bezpieczne to to było 10 lat temu a może nawet i nie. Jest to bardzo słabe zabezpieczenie. W erze tęczowych tabel odczytanie takiego hasha to chwila. Jest to możliwe dzięki generowaniu hashy dla wszelkich możliwych kombinacji tekstu o określonej ilości znaków i następnie porównywaniu hashy, a jeśli są takie same sprawdzamy jaki tekst wygenerował dany hash.

Trochę bezpieczniej

$haslo = "hasło"; 
$hash = md5($haslo . "sól" );

Jest lepiej bo w tym przypadku zabezpieczyliśmy się przed tęczowymi tabelami. Sól dodaje swoją zawartość do hasła użytkownika, dzięki czemu bez znajomości soli, haker nie skorzysta z tęczowych tabel ;-)
Samo MD5 jest(było) już tak szeroko stosowane iż ciągnie za sobą hakerów. A popularność robi swoje - to główne wytyczne hakerów. Większa popularność - więcej problemów.

Porzucamy MD5

Tak są "bezpieczniejsze" funkcje hashujące, czyli mniej popularne ;-)
Kolejna "potępiona" funkcja - SHA1. Powoli przejmuje pałeczkę MD5 i przyjmuje wszystkie obelgi na siebie.

$haslo = "hasło"; 
$hash = sha1($haslo . "sól" );

Więcej soli! więcej soli proszę!

Zatem solimy, ale sól mamy tylko jedną. Także gdy hashe ujrzą światło dzienne wraz z sólą to wszystkie hasła są zagrożone.
Rozwiązaniem jest przypisanie unikalnej soli dla każdego użytkownika. Musi to być stała wartość, np. data rejestracji, ip z rejestracji itd., aby sprawdzić hasło przy logowaniu.

$haslo = "hasło"; 
$sol = "192.168.0.1"; 
$hash = sha1($haslo . $sol );

W końcu bezpieczny?

Jeszcze nie ;-)
Gdy wycieknie baza, to wyciekną i sole, także trzeba utrudnić życie hakerom jeszcze bardziej.

$haslo = "hasło"; 
$sol = md5("192.168.0.1"); //sól użytkownika pobierana z bazy
$sol2 = sha1("qOR8Dm1L"); //sól dodatkowa
$hash = sha1($haslo . $sol  . $sol2);

Zastosowanie dodatkowej stałej soli, użycie różnych algorytmów oraz hashowanie samych soli doda +5 do bezpieczeństwa ;-)

SHA512

$haslo = "hasło"; 
$sol = md5("192.168.0.1"); //sól użytkownika pobierana z bazy
$sol2 = sha1("qOR8Dm1L"); //sól dodatkowa
$hash = hash('sha512', $haslo . $sol  . $sol2);

Teraz hashujemy mocniej, zatem teoretycznie bezpieczniej ;-)
Jak dla mnie jest to zdecydowanie wystarczająca forma przechowywania haseł.

Coś ekstra.

Co złego w sha512? Kolizje występowania takich samych hashy znikome, ale co z tego skoro można jeszcze bardziej świrować i hashować hashy hashe ;-D
Problemem może być: szybkość generowania nowych hashy do tęczowych tablic.
Ale jest rozwiązanie: phpass

Dla mnie jest to temat tak obszerny iż mógłbym napisać o tym pracę magisterską(pierw muszę napisać maturę) dlatego szyfrowanie danych(nie mylić z hashowaniem) zostawiam na następny wpis ;-)

PS. Jak będzie zainteresowanie to będzie i cała seria dotycząca bezpieczeństwa głównie w programowaniu.

PSS. Jakie są wasze opinie o wielokrotnym hashowaniu ? ;-) 

internet bezpieczeństwo programowanie

Komentarze