2013-10-13 24 views
9

Pracuję nad podsystemem uwierzytelniania Java, który określa przechowywanie haseł w DB jako PBKDF2-generowane skróty, a ja teraz próbuję zdecydować, czy powinienem użyć SHA1 lub SHA512 jako PFR. Przejrzałem specyfikacje obu, ale są one bardzo matematycznie intensywne, abym mógł je śledzić. Czy ktoś o lepszym zrozumieniu kryptografii może wyjaśnić, w jaki sposób PBKDF2WithHmacSHA512 różni się od PBKDF2WithHmacSHA512?PBKDF2WithHmacSHA512 vs. PBKDF2WithHmacSHA1

Oto, co usiłuję zrobić:

private static final int HASH_BYTE_SIZE = 64; // 512 bits 
private static final int PBKDF2_ITERATIONS = 1000;  

// generate random salt 
SecureRandom random = new SecureRandom(); 
byte salt[] = new byte[SALT_BYTE_SIZE]; // use salt size at least as long as hash 
random.nextBytes(salt); 

// generate Hash 
PBEKeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE); 
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // we would like this to be "PBKDF2WithHmacSHA512" instead? What Provider implements it? 
byte[] hash = skf.generateSecret(spec).getEncoded(); 

// convert hash and salt to hex and store in DB as CHAR(64)... 

Odpowiedz

0

SHA512 należy do rodziny SHA2 kryptograficznych funkcji skrótu. Ponieważ SHA1 ma teoretyczne słabe punkty, a SHA512 jest nieco wolniejszy niż SHA1 (wolniej jest lepsza przy haszowaniu haseł), SHA512 (lub jakakolwiek z rodziny SHA2) powinna zostać wybrana na SHA1 dla celów mieszania haseł.

Faktyczne zrozumienie różnic w funkcjach nie będzie proste, ale możesz mieć większą szansę na uzyskanie odpowiedzi na temat Crypto SE site.

+0

Prawo, szybkość (lub brak) jest krytyczna. Ale PBKDF2 zawiera przestrajalny czynnik pracy. W związku z tym względna prędkość SHA512 względem SHA1 jest nieistotna. –

34

Niech nam załamanie kawałek słowo po kawałku:

PBKDF2--WithHmac--SHA512 

Chodźmy nad nim część po części

  • PBKDF2

    podpórek Hasło oparte-Key-pochodna -Funkcja, następca PBKDF1 i służy do implementacji funkcji pseudolosowej, takiej jak kryptograficzny hasz, szyfr lub HMAC do hasło wejściowe lub hasło wraz z wartością soli i wielokrotnie powtarza proces, aby wygenerować klucz pochodny, który może następnie zostać użyty jako klucz kryptograficzny w kolejnych operacjach.

  • HMAC

    Stojaki na Keyed-Hash Message Authentication Code (HMAC) to specyficzna konstrukcja obliczania kodu uwierzytelniania wiadomości (MAC) obejmującej kryptograficznej funkcji skrótu w połączeniu z tajnego klucza kryptograficznego. Każda funkcja kryptograficznego skrótu może być używana do obliczania HMAC; uzyskany algorytm MAC jest odpowiednio nazywany HMAC-MD5 lub HMAC-SHA1.

  • SHA512

    Wiesz o tym ..: P

Teraz, wracając do twojego pytania, linia kodu:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 

określa keyFactory do korzystania z algorytmu PDBKDF2WithHmacSHA1. Kiedy zrobiłbyś coś takiego:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); 

mówisz fabryce, aby użyła algorytmu PBDKF2WithHmacSHA512.

essentialy Główną różnicą pomiędzy PBKDF2WithHmacSHA1 i PBKDF2WithHmacSHA512 jest następująca:

  1. PBKDF2WithHmacSHA1 będzie wytworzenia długości mieszania 160 bitów.
  2. PBKDF2WithHmacSHA512 będzie wyprodukować długość mieszania 512 bitów.

Dlatego te ostatnie są bezpieczniejsze. Ale są obie strony, które są wystarczające do szyfrowania. Bez debaty. Tylko mówię.

dodatkowych informacji o dwóch algorytmów:

  1. HMACSHA1

    HMACSHA1 jest typem algorytmu mieszania wpust, który jest zbudowany z funkcji SHA1 i wykorzystywane jako HMAC, lub kod uwierzytelniający oparty na haszyszu . Proces HMAC łączy tajny klucz z danymi wiadomości , porównuje wynik z funkcją skrótu, miesza ponownie wartość klucza tajnego z kluczem tajnym, a następnie ponownie stosuje funkcję mieszania . Wyjściowa wartość mieszania ma długość 160 bitów.

  2. HMACSHA512

    HMACSHA512 jest typem algorytmu mieszania wpust, który jest zbudowany z funkcję skrótu SHA-512 i wykorzystywane jako wiadomość Hash oparte kod uwierzytelniający (HMAC). Proces HMAC łączy tajny klucz z danymi wiadomości i powoduje skasowanie wyniku. Wartość skrótu jest mieszana ponownie z kluczem tajnym , a następnie mieszana po raz drugi. Wyjście hash ma długość 512 bitów.

Główną zaletą jest to, że HmacWith512 jest bardziej bezpieczny niż HmacWith256. Dla np.

HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 

HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a 

Różnica jest dość duża (jak widać). Mam nadzieję, że to pomoże. :)

EDIT: W PO wymienia

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength) 

Parametr keyLength służy do wskazania preferencji na długości klucza dla szyfrów zmiennej key-size. Rzeczywisty rozmiar klucza zależy od implementacji każdego dostawcy. Dlatego należy powiedzieć, że robienie czegoś takiego, jak np. nie oznacza, że ​​będziesz używać SHA1 do generowania klucza długości 512. To po prostu oznacza to. SHA1 obsługuje maksymalnie 160 bitów. Nie możesz tego przekroczyć.

Jeśli chodzi o drugie pytanie, spójrz na numer HMAC-SHA1. Istnieje wiele stwierdzeń, które mówią, że algorytmy takie jak SHA256 są całkiem dobre, jeśli masz długi skrót.

Ponadto, zgodnie z NSA:

NSA wskazuje, że „Krzywa eliptyczna Public Key Cryptography użyciu z 256-bitową prime modulo krzywej eliptycznej, jak określono w FIPS 186-2 i SHA-256 nadają się do ochrony informacji niejawnych do poziomu tajny. Korzystanie z 384-bitowym głównego modułu eliptyczna krzywa Sha-384 są konieczne dla ochrony ściśle tajne informacji.

Myślę, że używanie funkcji HMAC w połączeniu z SHA512 jest dość bezpieczne.

+1

Wspomniałeś, że główną różnicą między 'PDBKDF2WithHmacSHA1' i' PDBKDF2WithHmacSHA512' jest to, że produkują one inną długość mieszania (odpowiednio 160 bitów vs. 512bits). Jednak nie sądzę, że jest to poprawne, ponieważ argument 'keyLength' w' PBEKeySpec (char [] hasło, byte [] salt, int iterationCount, int keyLength) rządzi długością wytwarzanego skrótu. Jeśli uruchomię to, określając '512',' 256' i '160', otrzymam odpowiednie skróty o różnych długościach. – DTs

+0

"po obu stronach są argumenty na temat tego, co jest wystarczające do szyfrowania". Wszelkie linki będą mile widziane, chciałbym je przeczytać. Mogę znaleźć porównania między 'SHA1' a' SHA512', ale nie ma między 'PDBKDF2WithHmacSHA1' i 'PBKDF2WithHmacSHA512'. Btw, próbowałem '' SecretKeyFactory.getInstance ("PBKDF2WithHmacSHA512"); 'pierwotnie, ale rzuca' NoSuchAlgorithmException'. Nie zawarte w 'javax.crypto'? Chciałbym go użyć, ale nie mogę znaleźć dostawcy, który go oferuje, poza IAIK (pobierają kilka tysięcy dolarów za swoją bibliotekę JCE, oopss ..). Ktoś świadomy innych opcji? – DTs

+0

Uznajesz, że większa długość wynikowego skrótu jest wskaźnikiem "bezpieczniejszej" metody mieszania. Bez dostarczania jakichkolwiek komentarzy dotyczących wpływu długości skrótu dla określonego typu ataku, mówienie takich rzeczy jest raczej spekulatywne. Na przykład, jeśli wartość hashowana (np. Hasło) jest znana jako wystarczająco krótka, powiedzmy 8 znaków, nie ma większego znaczenia, jak duża jest wartość wyjściowa metody mieszania, o ile można ją wystarczająco szybko obliczać, brutala atak siłowy jest nadal możliwy. –