Blog (12)
Komentarze (233)
Recenzje (0)

Gdy zwykły hash to mało

@ArdziejGdy zwykły hash to mało20.02.2013 18:03

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.

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!

[code=PHP]$hash = md5("hasło");[/code]

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

[code=PHP]$haslo = "hasło"; $hash = md5($haslo . "sól" );[/code]

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.

[code=PHP]$haslo = "hasło"; $hash = sha1($haslo . "sól" );[/code]

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.

[code=PHP]$haslo = "hasło"; $sol = "192.168.0.1"; $hash = sha1($haslo . $sol );[/code]

W końcu bezpieczny?

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

[code=PHP]$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);[/code]

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

SHA512

[code=PHP]$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);[/code]

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 ? ;-)

InternetBezpieczeństwoProgramowanie
Udostępnij:
Wybrane dla Ciebie
Komentarze (20)