Kiedy dodajesz wartości soli do wartości skrótu dla czegoś takiego jak hasło, którego nie można zapisać zwykłym tekstem, jakie jest najlepsze miejsce, aby uzyskać wartości soli? Dla kontekstu załóżmy, że dotyczy to haseł do logowania na stronie internetowej.
12
Odpowiedzi:
Zwykle mam kolumnę
created TIMESTAMP
w tabeli użytkowników, dzięki czemu mogę zobaczyć, kiedy użytkownik się zarejestrował. Nie lubię dodawać dodatkowej kolumny dla Soli, więc używam kolumny znacznika czasu jako soli:źródło
Czy to ma znaczenie?
Sól służy dwóm celom. Uniemożliwia to stosowanie dużych tabel wstępnie ustawionych haseł („tęczowych tabel”) i sprawia, że identyczne hasła wyglądają inaczej na liście skrótów. Zróżnicowanie identycznych haseł pomaga uniknąć problemu polegającego na tym, że kilka osób używa jednego konkretnego hasła, które prawdopodobnie jest często słabym hasłem.
Dlatego każde konto powinno mieć własną unikalną sól, a sole nie powinny być zbyt przewidywalne, w tym sensie, że nie będzie grupy soli, która prawdopodobnie wystąpi. (Jeśli wiele witryn zaczynało się od 1 i policzyło, złoczyńcy mogliby budować tęczowe tabele, w tym na przykład sole o niskiej liczbie.) Nie muszą być losowe w żadnym innym sensie niż ogólnie nieprzewidywalne. Nie są one bardziej tajne niż sam hash, więc nie muszą być szczególnie niewygodne.
Użyj dowolnej dogodnej metody, aby wygenerować sól. Jeśli istnieje wiele potencjalnych wartości soli (wczesne systemy uniksowe często używały dwóch bajtów, dla możliwej liczby 65536) w porównaniu do liczby kont, pół losowe przypisanie prawie nigdy nie dałoby duplikatu soli.
źródło
Za każdym razem, gdy chcesz zapisać nowe hasło (rejestracja, resetowanie hasła, aktualizacja hasła), jedną z dobrych technik jest:
for i in (0...65536) { password = hmac(password) }
źródło
Wykorzystaj ramy. W .NET możesz użyć RNGCryptoServoiceProvider ...
Inne frameworki powinny mieć podobne klasy, które można wykorzystać. W celu osiągnięcia losowości oprogramowanie często zatrudnia użytkownika w porównaniu z
Random
powyższym. Losowe przesuwanie myszy w określonym obszarze w celu dostarczenia soli jest opcją stosowaną przez TrueCrypt. Sprowadza się do twoich konkretnych potrzeb i poziomu bezpieczeństwa; ponieważ twoja sól może po prostu być!@#$%
.źródło
Generujesz solną stronę serwera i przypisujesz ją do konta użytkownika po jego utworzeniu. Lepiej użyj interfejsu API do generowania kryptografii dostępnego w twoim frameworku, ale w zasadzie wystarczy dowolna sekwencja.
Zwykle rzeczy są przechowywane w ten sposób:
Przykład:
PasswordHashWithSalt =
A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q
źródło
Użyj bcrypt i przeczytaj ten artykuł, ponieważ same zwykłe skróty nie stanowią poważnej ochrony w dzisiejszych czasach.
Rozważ użycie protokołu zerowej wiedzy hasła SDR, który ma wiele bibliotek typu open source i jest wolny od patentów.
SDR wymaga soli i najlepszym miejscem do zdobycia tego jest klient; czas ich naciśnięcia klawiszy, ruchy myszy, mieszanie zmiennych środowiskowych, liczby losowe, czasy tworzenia plików w folderze tymczasowym, aby uzyskać sól na ich końcu w nieprzewidywalny sposób z dala od serwera. SDR bierze sól, dużą liczbę pierwszą, hasło użytkownika i generuje klucz weryfikacyjny. Nie przechowujesz hasła, które nigdy nie opuszcza ich komputera, ale możesz sprawdzić, czy mają hasło, które zawiera klucz weryfikacyjny i sól. Jest odporny na ataki człowieka w środku i ataki słownikowe. Dla pewności zaszyfruj klucze i sól w kolumnie bazy danych.
źródło