2011-11-09 11 views
8

Jest to kod używam do „hash” (lub czerpać kluczową jak nazywa się w realizacji PBKDF2 standardu PKCS) haseł struny z klasą Rfc2898DeriveBytes przewidzianego w NET:znaczenie podstawowych wielkości w Rfc2898DeriveBytes (PBKDF2) realizacja

int saltSize = 256; 
int iterations = 1000; 
int keySize = 20; // The parameter I'm not sure of 

var deriveBytes = new Rfc2898DeriveBytes("mypassword", saltSize, iterations); 
byte[] salt = deriveBytes.Salt; 
byte[] key = deriveBytes.GetBytes(keySize); 

teraz rozumiem, że rozmiar sól nie ma większego znaczenia (o ile to wystarczy, aby upewnić się, że losowe sole będzie wyjątkowy), ale co rozmiar klucza? Czy dłuższy klucz zapewnia większe bezpieczeństwo przed atakami?

(Uwaga:
1. Sprawy wydajności nie przywozili tu na mnie, to jest oczywiste, że dłuższy sól lub dłuższy klucz zajmie więcej czasu dla GetBytes zwrócić wartość
2. Chcę używać. ten "hash" do przechowywania ich w bazie danych, aby nie używać ich później w schemacie szyfrowania)

+0

dkLen ma długość w oktetów kluczowych pochodzi, liczbą dodatnią, co najwyżej 16 do MD2 lub MD5 i 20 dla SHA-1 – jdweng

Odpowiedz

6

Generalnie używa się PKCS # 5 v2/RFC2898 do tworzenia klucza symetrycznego z hasła użytkownika. Rozmiar jest ważny, ponieważ musi pasować do wymaganego rozmiaru algorytmu symetrycznego, z którego będziesz korzystać.

aes.Key = deriveBytes.GetBytes (16); // 16 * 8 = 128 bits 

Jednak ty wydaje się patrząc na prowadzenie hash hasła, nie na klucz, więc rozmiar nie jest tak ważne w konkretnym przypadku. Możesz bezpiecznie ustalić rozmiar skrótu (20 bajtów dla SHA1), jeśli chcesz mieć określoną wartość.

Uwaga ogólna (dla osób, gdzie kwestie wydajności) Używając PKCS # 5 v2 (lub starsze) zajmie dużo dłużej (iteracja liczy) niż przy użyciu solone hash lub HMAC.

+2

„za pomocą PKCS # 5 v2 (lub starszy) zajmie dużo dłużej (iteracja count) niż używanie solonego skrótu lub HMAC "Czy nie jest to powód, dla którego chcesz używać PKCS # 5 w pierwszej kolejności? Szybsze algorytmy ułatwiające uruchamianie ataków słownikowych na itd. – Joren

+1

Głównym powodem ** jest uzyskanie * silnych * (kryptograficznych) kluczy. Ale to nie jest ** dlaczego algorytm został użyty w pytaniu, więc zauważenie, że różnica między PKCS # 5 a soleniem/haszowaniem była właściwa IMHO. – poupou

0

keysize jest wielkością devired key; Więc jeśli chcesz uzyskać duży klucz pochodny, użyj większego rozmiaru klucza keySize.

Czas potrzebny na większy klucz jest proporcjonalny do int (keysize/hashsize), więc powinieneś ustawić keyize przynajmniej na taką samą długość jak hashsize.

Należy również użyć pochodnych kluczy o zalecanej długości, jeśli są używane w niektórych szyfrach, np. AES (128 - 256 bitów).