2013-08-06 38 views
8

Jesteśmy pomocą poniższego kodu w celu wygenerowania skrótu HMAC z wartością wrażliwych C#Różnica HMACSHA256 i HMACSHA512

public string GenerateHMac(string key, string message) 
{ 
    var decodedKey = Convert.FromBase64String(key); 

    var hasher = new HMACSHA256(decodedKey); 

    var messageBytes = Encoding.Default.GetBytes(message); 

    var hash = hasher.ComputeHash(messageBytes); 

    return Convert.ToBase64String(hash); 
} 

przekazywane w kluczu jest podstawa 256 bitów 64 zakodowany ciąg. Pojawiło się pytanie, czy powinniśmy używać HMACSHA256, HMACSHA384 lub HMACSHA512 do mieszania wartości.

  • Jakie są zalety korzystania z HMACSHA512 w porównaniu z HMACSHA256?
  • Czy jest znacznie bardziej bezpieczny?
  • Czy korzystanie z dłuższego klucza ma dramatyczne skutki?

Na marginesie; czy wartość decodedKey, którą przekazuję do konstruktora, musi być 512-bitowym kluczem, jeśli używam HMACSHA512?

+1

Strona [strona wikipedia] (http://en.wikipedia.org/wiki/SHA-2#Comparison_of_SHA_functions) ma dla nich pewne testy wydajności. – jbabey

Odpowiedz

15

Aby zobaczyć siłę samych metod haszowania, proszę spojrzeć na keylength.com website. Przekonasz się, że nawet SHA-256 ma dość duży margines bezpieczeństwa.

Co więcej, algorytm HMAC jest praktycznie nieświadomy ataków na bazowy algorytm mieszający. HMAC jest odporny na problem z urodzinami, który zmniejsza o połowę siłę do połowy wartości wynikowej skrótu. Nie ma to zastosowania tylko dlatego, że przeciwnik nie posiada tajnego klucza i dlatego nie może próbować tworzyć kolizji. Dlatego nawet HMAC-SHA1 jest dość bezpieczny.


Teraz prędkość skrótu zależy od środowiska wykonawczego. Ale generalnie możesz założyć następujące założenia:

  1. SHA-1 jest generalnie szybszy niż jakakolwiek implementacja SHA-2 na tej samej platformie;
  2. SHA-512 jest szybszy niż SHA-256 na maszynach 64-bitowych (ponieważ używa wewnętrznej arytmetyki 64-bitowej);
  3. SHA-256 jest szybszy niż SHA-512 na maszynach 8, 16 i 32-bitowych.

Skorzystaj z SHA-1, jeśli spodziewasz się problemów ze zgodnością. W przeciwnym razie możesz wybrać SHA-512 (i zmniejszyć wynik do rozsądnej liczby bitów). Stan wewnętrzny i wyższe bezpieczeństwo SHA-512 mogą być niewielką zaletą. Wystąpiły problemy z klientami, którzy nie akceptują żadnej formy SHA-1 z powodu ogólnych problemów z algorytmem; innymi słowy, fakt, że nie jest bezpieczny ogólnie może utrudniać akceptację.


Uwaga SHA-384 i mniej znane SHA-512/256 i SHA-512/224 sposoby mieszania są specjalną formą SHA-512, cięcia 384, 256 i 224 wyjścia bitów. Szybkość tych algorytmów jest identyczna. Jedyną różnicą, poza wielkością wyjściową, jest to, że te specjalne formularze używają wewnętrznie różnych wartości początkowych. W przeciwnym razie SHA-512 przycięty do 384 bitów jest równie bezpieczny i szybki jak SHA-512/384. Powinieneś jednak używać SHA-384, aby zachować kompatybilność.


Wielkość klucza wejściowego nie zależy od podstawowej funkcji skrótu. Klucz jest najpierw maskowany przez XOR, a następnie mieszany za pomocą funkcji skrótu; algorytmy mieszania mogą pobierać praktycznie nieograniczoną ilość danych jako dane wejściowe.

Zaleca się użycie klucza o rozmiarze co najmniej wielkości użytej metody hashowania, w przeciwnym razie można obniżyć margines bezpieczeństwa zapewniany przez metodę HMAC. Może występować niewielka kara za wydajność, jeśli wielkość klucza wymusza na algorytmie skrótu mieszanie wielu bloków.


Można również użyć (zbliżającego się) standardu SHA-3 w tym sensie, że byłby bezpieczny. HMAC-SHA-3 obecnie nie ma jednak zbyt dużego sensu. HMAC jest w rzeczywistości przesadą dla SHA-3 (Keccak); SHA-3 powinien być bezpieczny nawet bez konstrukcji HMAC. [Edytuj] Do tej pory KMAC został wystandaryzowany jako konstrukt MAC dla SHA-3.

Poza tym konstrukty SHA-2 mają - nieco zaskakująco - bardzo dobrą odporność na analizę kryptową podczas zawodów SHA-3. Tak więc nie ma pilnej potrzeby aktualizacji do SHA-3.

4

Nie sądzę, abyś musiał się martwić o zalety związane z bezpieczeństwem, ale HmacSha1 wciąż jest uważany za secure, a bezpieczeństwo powinno być uważane za względne w stosunku do długości klucza. Działanie Sha256 vs Sha512 zależy od implementacji, platformy itp., Musisz samemu sprawdzić. Kluczowe długości dostarczane do HMAC są niezależne od algorytmu skrótu, patrz pseudocode.

+0

Dokument przejściowy NIST (http://csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf), Tabela 9: Przejścia funkcji skrótu, niedozwolone SHA-1 dla niektórych zastosowań po 2013 r., W tym cyfrowe podpisy. SHA-1 może być nadal akceptowalny w przypadku użycia HMAC, ale SHA-2 jest powszechnie dostępny i nie jest przestarzały ze względów bezpieczeństwa. Jak wygodny jesteś jako programista używający algorytmu bezpieczeństwa, który jest stopniowo wycofywany ze względu na ukrytą słabość? – ingyhere

+0

Nie polecałem używania HMACSHA1, podawałem go jako daleko idący przykład, aby nie martwić się o bezpieczeństwo HMACSHA512 w stosunku do HMACSHA256 i skupiać się na keylength. – jbtule

0

HMAC wywołuje algorytm hashowania dwa razy, a SHA3 nie wymaga konstrukcji HMAC dla kluczowanego hashu, więc można łatwo uniknąć podwójnej inwokacji. W rezultacie SHA3 pokonuje HMAC-SHA2 w wydajności i HMAC-SHA1 w bezpieczeństwie (najlepsze z obu światów).