Platforma .NET jest dostarczana z 6 różnymi algorytmami mieszania:
- MD5: 16 bajtów (czas do skrótu 500 MB: 1462 ms)
- SHA-1: 20 bajtów (1644 ms)
- SHA256: 32 bajty (5618 ms)
- SHA384: 48 bajtów (3839 ms)
- SHA512: 64 bajty (3820 ms)
- RIPEMD: 20 bajtów (7066 ms)
Każda z tych funkcji działa inaczej; MD5 jest najszybszy, a RIPEMD najwolniejszy.
MD5 ma tę zaletę, że pasuje do wbudowanego typu Guid; i stanowi podstawę UUID typu 3 . Skrót SHA-1 jest podstawą UUID typu 5. Co sprawia, że są naprawdę łatwe w użyciu do identyfikacji.
MD5 jest jednak podatny na ataki kolizyjne , SHA-1 jest również podatny, ale w mniejszym stopniu.
W jakich warunkach powinienem używać algorytmu haszującego?
Konkretne pytania, na które jestem bardzo ciekawa, mają odpowiedzi:
Czy MD5 nie jest godne zaufania? W normalnych sytuacjach, gdy używasz algorytmu MD5 bez złośliwych zamiarów i żadna osoba trzecia nie ma żadnych złośliwych zamiarów, możesz spodziewać się ŻADNYCH kolizji (czyli dwóch dowolnych bajtów [] tworzących ten sam hash)
O ile lepszy jest RIPEMD niż SHA1? (jeśli jest lepszy) jego obliczenie jest 5 razy wolniejsze, ale rozmiar skrótu jest taki sam jak SHA1.
Jakie są szanse na niezłośliwe kolizje podczas haszowania nazw plików (lub innych krótkich ciągów znaków)? (Np. 2 losowe nazwy plików z tym samym hashem MD5) (z MD5 / SHA1 / SHA2xx) Jakie są ogólne szanse na niezłośliwe kolizje?
Oto wzorzec, którego użyłem:
static void TimeAction(string description, int iterations, Action func) {
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
static byte[] GetRandomBytes(int count) {
var bytes = new byte[count];
(new Random()).NextBytes(bytes);
return bytes;
}
static void Main(string[] args) {
var md5 = new MD5CryptoServiceProvider();
var sha1 = new SHA1CryptoServiceProvider();
var sha256 = new SHA256CryptoServiceProvider();
var sha384 = new SHA384CryptoServiceProvider();
var sha512 = new SHA512CryptoServiceProvider();
var ripemd160 = new RIPEMD160Managed();
var source = GetRandomBytes(1000 * 1024);
var algorithms = new Dictionary<string,HashAlgorithm>();
algorithms["md5"] = md5;
algorithms["sha1"] = sha1;
algorithms["sha256"] = sha256;
algorithms["sha384"] = sha384;
algorithms["sha512"] = sha512;
algorithms["ripemd160"] = ripemd160;
foreach (var pair in algorithms) {
Console.WriteLine("Hash Length for {0} is {1}",
pair.Key,
pair.Value.ComputeHash(source).Length);
}
foreach (var pair in algorithms) {
TimeAction(pair.Key + " calculation", 500, () =>
{
pair.Value.ComputeHash(source);
});
}
Console.ReadKey();
}
źródło
Odpowiedzi:
W kryptografii funkcje skrótu zapewniają trzy oddzielne funkcje.
Te właściwości są powiązane, ale niezależne. Na przykład odporność na kolizje oznacza odporność na drugi obraz przedobrazem, ale nie na odwrót. W przypadku dowolnej aplikacji będziesz mieć różne wymagania, wymagając co najmniej jednej z tych właściwości. Funkcja skrótu do zabezpieczania haseł na serwerze zwykle wymaga tylko odporności na przedobraz, podczas gdy przeglądanie wiadomości wymaga wszystkich trzech.
Wykazano, że MD5 nie jest odporny na kolizje, co jednak nie wyklucza jego stosowania w zastosowaniach niewymagających odporności na kolizję. Rzeczywiście, MD5 jest często nadal używany w aplikacjach, w których mniejszy rozmiar klucza i mniejsza prędkość są korzystne. To powiedziawszy, ze względu na jego wady, badacze zalecają użycie innych funkcji skrótu w nowych scenariuszach.
SHA1 ma wadę, która pozwala na znalezienie kolizji w teoretycznie znacznie mniejszych krokach niż 2 ^ 80 kroków, których wymagałaby bezpieczna funkcja skrótu dla jego długości. Atak jest nieustannie poprawiany i obecnie można go wykonać w ~ 2 ^ 63 krokach - ledwo mieszcząc się w obecnym obszarze obliczalności. Z tego powodu NIST wycofuje stosowanie SHA1, stwierdzając, że rodzina SHA2 powinna być używana po 2010 roku.
SHA2 to nowa rodzina funkcji skrótu utworzona po SHA1. Obecnie nie są znane żadne ataki na funkcje SHA2. SHA256, 384 i 512 są częścią rodziny SHA2, używają tylko różnych długości kluczy.
RIPEMD Nie mogę zbytnio komentować, z wyjątkiem tego, że nie jest tak powszechnie używany jak rodziny SHA, a więc nie został tak dokładnie zbadany przez badaczy kryptografów. Tylko z tego powodu zalecałbym użycie nad nim funkcji SHA. W implementacji, której używasz, również wydaje się dość powolny, co czyni go mniej użytecznym.
Podsumowując, nie ma jednej najlepszej funkcji - wszystko zależy od tego, do czego jej potrzebujesz. Uważaj na wady każdego z nich, a najlepiej będziesz w stanie wybrać odpowiednią funkcję skrótu do swojego scenariusza.
źródło
Wszystkie funkcje skrótu są „zepsute”
Zasada szufladki mówi, że staraj się tak mocno, jak tylko chcesz, nie możesz zmieścić więcej niż 2 gołębi w 2 dołkach (chyba że pokroisz gołębie). Podobnie nie możesz zmieścić 2 ^ 128 + 1 liczb w 2 ^ 128 slotach. Wszystkie funkcje haszujące dają skrót o skończonym rozmiarze, co oznacza, że zawsze możesz znaleźć kolizję, przeszukując sekwencje o skończonym rozmiarze + 1. Po prostu nie jest to wykonalne. Nie dla MD5 i nie dla Skein .
MD5 / SHA1 / Sha2xx nie mają szans na kolizje
Wszystkie funkcje skrótu mają kolizje, to fakt. Przypadkowe trafienie w te kolizje jest równoznaczne z wygraną w międzygalaktycznej loterii . To znaczy, nikt nie wygrywa w loterii międzygalaktycznej , po prostu nie tak działa loteria. NIGDY nie spotkasz przypadkowego skrótu MD5 / SHA1 / SHA2XXX. Każde słowo w każdym słowniku, w każdym języku ma inną wartość. Każda nazwa ścieżki na każdej maszynie na całej planecie ma inny skrót MD5 / SHA1 / SHA2XXX. Skąd to wiem, możesz zapytać. Cóż, jak powiedziałem wcześniej, nikt nigdy nie wygrywa na loterii międzygalaktycznej.
Ale ... MD5 jest zepsuty
Czasami fakt, że jest zepsuty, nie ma znaczenia .
W obecnej postaci nie są znane żadne ataki typu pre-image ani drugie ataki typu pre-image na MD5.
Więc co jest takiego zepsutego w MD5, możesz zapytać? Strona trzecia może wygenerować 2 wiadomości, z których jedna jest ZŁA, a druga jest DOBRA i obie mają tę samą wartość. ( Atak kolizyjny )
Niemniej jednak, obecnym zaleceniem RSA jest, aby nie używać MD5, jeśli potrzebujesz odporności przed obrazem. Jeśli chodzi o algorytmy bezpieczeństwa, ludzie mają skłonność do nadmiernej ostrożności.
Więc jakiej funkcji skrótu powinienem używać w .NET?
Powtórz to po mnie, nie ma szans na kolizje MD5 , złośliwe kolizje można starannie zaprojektować. Mimo że do tej pory nie są znane żadne ataki typu pre-image na MD5, eksperci ds. Bezpieczeństwa twierdzą, że MD5 nie powinno być używane tam, gdzie trzeba bronić się przed atakami sprzed aktualizacji obrazu. SAME dotyczy SHA1 .
Pamiętaj, że nie wszystkie algorytmy muszą bronić się przed atakami przed obrazem lub kolizjami. Weźmy trywialny przypadek pierwszego przejścia w poszukiwaniu duplikatów plików na dysku twardym.
Nikt nigdy nie znalazł kolizji SHA512. ZAWSZE. Bardzo się starali. Zresztą nikt nigdy nie znalazł kolizji SHA256 lub 384. .
RIPMED nie otrzymał takiej kontroli, jaką otrzymały SHAX i MD5. Zarówno SHA1, jak i RIPEMD są podatne na ataki urodzinowe. Oba są wolniejsze niż MD5 na platformie .NET i mają niewygodne 20 bajtów. Nie ma sensu korzystać z tych funkcji, zapomnij o nich.
Ataki kolizyjne SHA1 są ograniczone do 2 ^ 52, nie potrwa to zbyt długo, dopóki kolizje SHA1 nie pojawią się na wolności.
Aby uzyskać aktualne informacje na temat różnych funkcji skrótu, zajrzyj do zoo funkcji skrótu .
Ale poczekaj, jest więcej
Posiadanie szybkiej funkcji skrótu może być przekleństwem. Na przykład: bardzo powszechnym zastosowaniem funkcji skrótu jest przechowywanie haseł. Zasadniczo obliczasz skrót hasła w połączeniu ze znanym losowym ciągiem znaków (aby utrudnić ataki tęczowe) i przechowujesz ten skrót w bazie danych.
Problem polega na tym, że jeśli napastnik otrzyma zrzut bazy danych, może dość skutecznie odgadnąć hasła za pomocą brutalnej siły. Każda kombinacja, którą próbuje, zajmuje tylko ułamek milisekundy, a on może wypróbować setki tysięcy haseł na sekundę.
Aby obejść ten problem, można użyć algorytmu bcrypt , który został zaprojektowany tak, aby był powolny, więc atakujący będzie znacznie spowolniony, jeśli zaatakuje system za pomocą bcrypt. Ostatnio scrypt znalazł się w nagłówku i przez niektórych jest uważany za bardziej skuteczny niż bcrypt, ale nie znam implementacji .Net.
źródło
Aktualizacja:
Czasy się zmieniły, mamy zwycięzcę SHA3. Polecam użycie keccak (aka SHA3 ) zwycięzcy konkursu SHA3.
Oryginalna odpowiedź:
W kolejności od najsłabszego do najsilniejszego powiedziałbym:
Osobiście użyłbym MD6, ponieważ nigdy nie można być zbyt paranoikiem. Jeśli szybkość jest prawdziwym problemem, spojrzę na Skein lub SHA-256.
źródło
W obronie MD5 nie ma znanego sposobu na utworzenie pliku z dowolnym hashem MD5. Oryginalny autor musi z wyprzedzeniem zaplanować kolizję roboczą. Tak więc, jeśli odbiorca ufa nadawcy, MD5 jest w porządku. MD5 jest zepsuty, jeśli osoba podpisująca jest złośliwa, ale nie wiadomo, czy jest podatna na ataki typu man-in-the-middle.
źródło
To, którego używasz, naprawdę zależy od tego, do czego go używasz. Jeśli chcesz tylko upewnić się, że pliki nie zostaną uszkodzone podczas przesyłania i nie przejmujesz się zbytnio bezpieczeństwem, wybierz szybkie i małe. Jeśli potrzebujesz podpisów cyfrowych do federalnych umów ratunkowych o wartości wielu miliardów dolarów i chcesz mieć pewność, że nie są one sfałszowane, podejmij trudną do podrobienia i powolną.
źródło
Chciałbym powiedzieć (zanim md5 się rozpadnie), że nadal intensywnie używam md5, pomimo jego przytłaczającej awarii dla wielu kryptowalut.
Tak długo, jak nie zależy ci na ochronie przed kolizjami (nadal możesz bezpiecznie używać md5 również w hmac) i chcesz mieć prędkość (czasami wolisz wolniejszy hash), nadal możesz śmiało używać md5.
źródło
Byłoby dobrym pomysłem przyjrzenie się algorytmowi BLAKE2 .
Jak opisano, jest szybszy niż MD5 i co najmniej tak samo bezpieczny jak SHA-3. Jest również wdrażany przez kilka aplikacji , w tym WinRar.
źródło
Nie jestem ekspertem w tego typu sprawach, ale nadążam za społecznością zajmującą się bezpieczeństwem i wiele osób uważa, że hash md5 jest uszkodzony. Powiedziałbym, że to, którego użyć, zależy od wrażliwości danych i konkretnej aplikacji. Możesz być w stanie uciec z nieco mniej bezpiecznym hashem, o ile klucz jest dobry i mocny.
źródło
Oto moje sugestie dla Ciebie:
Zobacz tutaj artykuł szczegółowo opisujący algorytm tworzenia kolizji md5 w 31 sekund z komputerem stacjonarnym Intel P4.
http://eprint.iacr.org/2006/105
źródło