2013-02-07 12 views
6

Jestem twórcą nowej strony internetowej zbudowany w PHP i zastanawiam się, co dokładnie jest najlepszym rzeczą użyć do mieszaja. Spojrzałem na md5 i sha1, ale czy jest coś bardziej bezpiecznego.
Przepraszam, jeśli jest to Nooby pytanie, ale jestem nowy w PHP Bezpieczeństwa i staram się, aby moja miejsce tak bezpieczne, jak to możliwe. Co to jest sól?
Dzięki,
WaseemPHP - MD5, SHA, Hashing bezpieczeństwa

+1

Do czego będziesz używać skrótu? Co do soli zobacz http://pl.wikipedia.org/wiki/Salt_(cryptography) –

+0

Hasła i nazwy użytkowników –

+0

Podpowiedź: 'bcrypt' - to wszystko. – Leigh

Odpowiedz

9

pierwsze MD5 i SHA1 okazały się być vunrable na ataki kolizyjne i może być tęczowy zgłoszona łatwo (Gdy widzą jeśli hash jest taka sama w swojej bazie wspólnych haseł).
Obecnie dwie rzeczy, które są na tyle bezpieczne dla haseł, które można wykorzystać.
przy czym pierwsze sha512. sha512 to podwersja SHA2. SHA2 jeszcze nie okazały się być vunrable na ataki kolizji i SHA512 generuje 512-bitowy skrót. Oto przykład z jak użyć SHA512:

<?php 
hash('sha512',$password); 

Druga opcja nazywa bcrypt. bcrypt słynie z bezpiecznych skrótów. Jest to prawdopodobnie najbezpieczniejszy i najbardziej konfigurowalny.
Przed chcesz rozpocząć korzystanie bcrypt trzeba sprawdzić, czy Sever ma ona włączona, wprowadź ten kod:

<?php 
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { 
    echo "CRYPT_BLOWFISH is enabled!"; 
}else { 
echo "CRYPT_BLOWFISH is not available"; 
} 

Jeśli zwróci, że jest on włączony następnym krokiem jest łatwe, wszystko co trzeba zrobić, aby bcrypt się hasło to (uwaga, aby uzyskać więcej Dostosowalność trzeba zobaczyć How do you use bcrypt for hashing passwords in PHP?):

crypt($password, $salt); 

teraz odpowiedzieć na pytanie drugie. Sól jest usally losowym ciągiem że dodasz na końcu wszystko co haseł podczas ich mieszania. Używanie soli oznacza, że ​​jeśli ktoś dostanie twoją bazę danych , nie może sprawdzić skrótów pod kątem popularnych haseł. Sprawdzanie bazy danych jest wywoływane za pomocą tęczowej tabeli. Powinieneś zawsze używać soli podczas smażenia !!

Oto moje dowody na SHA1 i MD5 ataku kolizja luk:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html, http://eprint.iacr.org/2010/413.pdf, http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf, http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf i Understanding sha-1 collision weakness

+4

Dla przypomnienia: bcrypt słynie z tego, że _nie_ jest szybki, ale bardzo wolny (http://codahale.com/how-to-safely-store-a-password/). – ckruse

+0

Świetna odpowiedź !!! – Mez

+0

@ckruse Przepraszamy za błąd, naprawię go :) – C1D

1

Cały Celem soli jest spowolnienie intruzom porównując listę pre generowane hashe przeciwko docelowemu hashowi.

Zamiast konieczności wstępnego wyliczenia jeden „zaszyfrowany” wartość dla każdego zwykłego tekstu hasło, atakujący musi wstępnego wyliczenia 16384 „mieszany” wartości dla każdego hasła zwykłego tekstu (2^7 * 2^7).

Ten rodzaj blednie dzisiaj, ale był dość duży, gdy funkcja kryptowa została po raz pierwszy opracowana - moc obliczeniowa do wstępnego obliczenia, że ​​wiele haseł razy liczba hasła jawnego, które podejrzewasz (słownik) była dość wysoka.

Nie tak dużo dzisiaj, dlatego mamy takie rzeczy jak hasła w cieniu, inne podstawowe funkcje hasła oprócz krypty i każdy sysad, który chce wybrać hasło, które nie pojawi się w słowniku.

Jeśli hashy, które chcesz wygenerować dla haseł, jest to dobrze przyjęta metoda implementacji.

http://www.openwall.com/phpass/

+0

Dzięki za informacje! –

+0

Nie mam pojęcia, jak masz numer 16384, a solenie jest równie ważne jak nigdy dotąd. Kiedy połączysz każde hasło z inną solą, osoba atakująca będzie musiała zbudować tabelę tęczy dla każdego hasła i nie będzie mogła użyć 1 tabeli-tęczy, aby uzyskać wszystkie hasła. Taki jest cel soli, nie jest tajemnicą i nie pomoże w ataku słownikowym. – martinstoeckli

+0

@martinstoeckli - Myślę, że Danilo przyjął dwie 7-bitowe znaki ASCII jako sól, a więc 16 384 możliwości. I myślę, że jesteście "rozmawiający obok siebie", tj. Myślę, że obaj mówicie to samo. Zamiast tęczowej tabeli dla haseł "n", teraz jest 16k wpisów dla każdego z "n" haseł (lub, konceptualnie, 16K x "n" macierzy zamiast "tablicy" n). – Dan

0

Jeśli planujesz to zrobić dla haseł, a następnie nie używaj MD5 lub SHA1. Wiadomo, że są słabi i niepewni, nawet z solą.

Jeśli używasz ich do innych celów (np. Dostarczenia skrótu pliku do potwierdzenia jego autentyczności lub losowej kolumny bazy danych hash, aby zapewnić pseudolosową kolejność sortowania), to są one w porządku (do pewnego momentu), ale nie dla haseł ani niczego, co mogłoby być potrzebne do zachowania bezpieczeństwa.

Obecny algorytm najlepszej praktyki dla hasing hasing to BCrypt z odpowiednim soleniem.

Najlepszym sposobem na wdrożenie hasła hashującego w PHP jest użycie nowego API do haseł PHP. Ten interfejs API zostanie przedstawiony jako zestaw wbudowanych funkcji w następnej wersji PHP, w wersji 5.5, który ma zostać wydany w ciągu najbliższych kilku miesięcy. Dobrą wiadomością jest to, że wydali także wersję kompatybilną wstecz dla użytkowników aktualnych wersji PHP (5.3 i 5.4), więc nawet jeśli PHP 5.5 nie jest jeszcze wydane, możesz od razu zacząć korzystać z nowego API.

Można pobrać biblioteki zgodności stąd: https://github.com/ircmaxell/password_compat

również: Pytałeś co „Sól” jest. Ponieważ wspomniałem o tym kilka razy w tej odpowiedzi, powinienem również odpowiedzieć na tę część pytania.

Sól to w zasadzie dodatkowy ciąg dodawany do hasła podczas haszowania, aby utrudnić złamanie.

Na przykład osoba atakująca może z góry wiedzieć, jaka jest wartość hashowana dla danego ciągu hasła, a nawet cała masa podanych łańcuchów hasła. Jeśli uda mu się zdobyć zakodowane dane i nie użyjesz soli, może po prostu porównać swoje hashe z listą znanych haseł, a jeśli któryś z Twoich użytkowników użyje łatwego do odgadnięcia hasła, będą pęknięte w ciągu kilku sekund, niezależnie od tego, jaką metodę hashing zastosowano.

Jeśli jednak dodasz tajny dodatkowy ciąg do hasła podczas haszowania, wartość zakodowana nie będzie odpowiadać standardowej wartości skrótu dla oryginalnego hasła, co utrudni atakującemu znalezienie wartości .

Dobrą wiadomością jest to, że jeśli używasz interfejsu API, o którym wspomniałem powyżej, nie musisz się martwić o szczegóły tego, ponieważ interfejs API obsługuje solenie.

Nadzieję, że pomaga.