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.
@DevArt, pomyślałem, że lepiej tu pasuje, ponieważ wymaga bardzo subiektywnej odpowiedzi. Wartość soli można pobrać z dowolnego miejsca, więc pytam: „Jak myślisz, gdzie jest najbezpieczniejsza lokalizacja do pobierania wartości soli z: klienta lub serwera?”
Zwykle mam kolumnę created TIMESTAMPw 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:
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.
Zasadniczo widziałem drugi problem - identyczne hasła wyglądające inaczej - rozwiązany przez połączenie nazwy użytkownika, soli i hasła oraz zaszyfrowanie całego łańcucha. Eliminuje to konieczność generowania unikalnej soli na konto.
@Justin: ciekawe, nigdy nie widziałem nazwy użytkownika używanej jako część skrótu, ale to naprawdę dobry sposób na dodanie entropii. Nadal używałbym pseudolosowej soli, tylko dlatego, że jej wytworzenie nie kosztuje dużo.
@ Matthieu Minusem jest to, że trzeba go gdzieś przechowywać, a jeśli obie strony potrzebują go, to także muszą go wysłać. Dzięki nazwie użytkownika obie strony już ją znają.
@Justin: W takim przypadku używasz nazwy użytkownika jako soli. Odpowiada na oba cele soli: sprawienie, że tablice tęczowe są niepraktyczne, a podobne hasła wyglądają inaczej.
@David - Prawda, możesz spojrzeć na to, jak nazwa użytkownika staje się częścią soli. Nadal chciałbym dodatkowej soli, aby atakujący nie mógł użyć tęczowej tabeli do znalezienia kombinacji nazwy użytkownika / hasła. Bez wyraźnej soli, po prostu zwiększasz rozmiar ciągu, którego atakujący potrzebuje z tęczowej tabeli o długość nazwy użytkownika (która może być krótka i albo całkowicie mała, albo całkowicie duża). Stała sól wystarcza, aby udaremnić atak tęczowej tabeli, chyba że witryna jest wystarczająco duża, aby atakujący wygenerował tęczową tabelę.
// If salt is not specified, generate it on the fly.
if (saltBytes == null)
{
// Define min and max salt sizes.
int minSaltSize = 4;
int maxSaltSize = 8;
// Generate a random number for the size of the salt.
Random random = new Random();
int saltSize = random.Next(minSaltSize, maxSaltSize);
// Allocate a byte array, which will hold the salt.
saltBytes = new byte[saltSize];
// Initialize a random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Fill the salt with cryptographically strong byte values.
rng.GetNonZeroBytes(saltBytes);
}
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 Randompowyż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ć !@#$%.
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:
User
-------------------
ID
Username
PasswordHashWithSalt
Przypisać to na podstawie czego? Czy nie musi pochodzić z pewnej wartości, która pozostanie na miejscu, aby można ją było replikować, gdy użytkownik zaloguje się ponownie po utworzeniu?
Przez „przypisanie” mam na myśli wygenerowanie soli na parę nazwa użytkownika / hasło (konto) i zapisanie jej w bazie danych. Kiedy musisz się zalogować, używasz przechowywanej soli do sprawdzania rzeczy.
1
Użyj bcrypt i przeczytaj ten artykuł, ponieważ same zwykłe skróty nie stanowią poważnej ochrony w dzisiejszych czasach.
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.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.