Jaką kryptograficzną funkcję skrótu wybrać?

. NET framework zawiera 6 różnych algorytmów haszujących:

  • MD5: 16 bajtów (czas na hash 500MB: 1462 ms)
  • SHA1: 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 najszybsza, a RIPEMD najwolniejsza.

MD5 ma tę zaletę, że mieści się we wbudowanym Guid Typ. Co sprawia, że jest naprawdę łatwy w użyciu do identyfikacji.

MD5 jest jednak podatny na ataki kolizji , SHA1 jest również podatny, ale w mniejszym stopniu.

Na jakich warunkach powinienem użyć algorytmu haszującego?

Konkretne pytania, na które jestem ciekawa odpowiedzi, to:

  • Czy nie można ufać MD5? W normalnych sytuacjach, gdy używasz algorytmu MD5 bez złośliwych intencji i żadna strona trzecia nie ma złośliwych intencji czy spodziewasz się kolizji (co oznacza, że dwa dowolne bajty[] wytwarzają ten sam hash)

  • O ile lepszy jest RIPEMD niż SHA1? (jeśli jest lepszy) jego 5 razy wolniej obliczyć, ale rozmiar hash jest taki sam jak SHA1.

  • Jakie są szanse na uzyskanie Nie złośliwych kolizji podczas haszowania nazw plików (lub innych krótkich łańcuchów)? (Np. 2 losowe nazwy plików z tym samym Hashem MD5) (Z MD5 / SHA1 / SHA2xx) ogólnie jakie są szanse na nie złośliwe kolizje?

To jest benchmark, 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();
    }
Author: icktoofay, 2009-04-29

9 answers

W kryptografii funkcje haszujące zapewniają trzy oddzielne funkcje.

  1. Odporność na kolizje : Jak trudno jest komuś znaleźć dwie wiadomości (dowolne dwie wiadomości), które mają ten sam haszat.
  2. Preimage Resistance : biorąc pod uwagę hash, jak trudno jest znaleźć inną wiadomość, która ma ten sam hash? Znany również jako one way hash function .
  3. Second preimage resistance : Po otrzymaniu wiadomości znajdź inną wiadomość, która ma ten sam hash.

Te właściwości są powiązane, ale niezależne. Na przykład odporność na kolizje oznacza drugą odporność na preimage, ale nie na odwrót. Dla każdej aplikacji będziesz miał różne wymagania, wymagające jednej lub więcej z tych właściwości. Funkcja hash do zabezpieczania haseł na serwerze zwykle wymaga tylko preimage resistance, podczas gdy przeglądanie wiadomości wymaga wszystkich trzech.

Wykazano, że MD5 nie jest odporny na kolizje, jednak nie wyklucza jego zastosowanie w aplikacjach, które nie wymagają odporności na kolizje. W rzeczywistości MD5 jest często nadal używany w aplikacjach, w których mniejszy rozmiar klucza i szybkość są korzystne. To powiedziawszy, ze względu na swoje wady, naukowcy zalecają stosowanie innych funkcji hash w nowych scenariuszach.

SHA1 ma wadę, która pozwala na znalezienie kolizji w teoretycznie znacznie mniejszym stopniu niż 2^80 kroków, których wymagałaby bezpieczna funkcja hash o swojej długości. Atak jest stale aktualizowany i obecnie może być wykonane w ~2^63 krokach - tylko ledwo w obecnej dziedzinie obliczeniowości. Z tego powodu NIST wycofuje stosowanie SHA1, stwierdzając, że rodzina SHA2 powinna być używana po 2010 roku.

SHA2 jest nową rodziną funkcji hashowych utworzonych po SHA1. Obecnie nie są znane ataki na funkcje SHA2. SHA256, 384 i 512 są częścią rodziny SHA2, po prostu używając różnych długości kluczy.

RIPEMD nie mogę za dużo komentować, tylko zauważyć, że nie jest tak często używany jako rodzina SHA, a więc nie został tak dokładnie zbadany przez badaczy kryptograficznych. Tylko z tego powodu zalecałbym użycie funkcji SHA nad nim. W implementacji, której używasz, wydaje się również dość powolny, co czyni go mniej użytecznym.

Podsumowując, nie ma jednej najlepszej funkcji - wszystko zależy od tego, do czego jest potrzebna. Pamiętaj o wadach każdego z nich, a będziesz w stanie najlepiej wybrać odpowiednią funkcję skrótu dla Twojego scenariusza.

 128
Author: Eric Burnett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 06:30:15

Wszystkie funkcje hash są " złamane"

Zasada pigeonhole mówi, że staraj się tak mocno, jak chcesz, nie możesz zmieścić więcej niż 2 gołębie w 2 otworach(chyba że pociąłeś gołębie). Podobnie nie możesz zmieścić 2 ^ 128 + 1 liczb w 2^128 slotach. Wszystkie funkcje hash dają hash o skończonej wielkości, co oznacza, że zawsze możesz znaleźć kolizję, jeśli przeszukasz sekwencje" skończonej wielkości " + 1. Po prostu nie jest to możliwe. Nie dla MD5 i nie dla Motek .

MD5 / SHA1 / Sha2xx nie mają szans

Wszystkie funkcje hash mają kolizje, to jest fakt życia. Trafienie na te kolizje przez przypadek jest odpowiednikiem wygranej w międzygalaktycznej loterii. To znaczy, nikt nie wygrywa międzygalaktycznej loterii , to po prostu nie tak działa loteria. Nigdy nie natkniesz się na przypadkowy hash MD5 / SHA1/SHA2XXX. Każde słowo w każdym słowniku, w każdym języku, hashuje do inna wartość. Każda nazwa ścieżki, na każdej maszynie na całej planecie ma inny hash MD5 / SHA1/SHA2XXX. Skąd mam to wiedzieć? Jak już mówiłem, nikt nigdy nie wygra międzygalaktycznej loterii.

Ale ... MD5 jest zepsuty

Czasami fakt, że jego złamanie nie ma znaczenia .

W obecnym stanie nie są znaneataki pre-image lub second pre-image na MD5.

Więc co jest tak zepsute w MD5, można zapytać? Jest to możliwe dla osoby trzeciej wygenerować 2 wiadomości, z których jeden jest zły, a drugi jest dobry, że oba hash do tej samej wartości. ( Collision attack )

Niemniej jednak, obecne zalecenie RSA nie polega na używaniu MD5, jeśli potrzebujesz odporności przed obrazem. Ludzie mają tendencję do błądzenia po stronie ostrożności, jeśli chodzi o algorytmy bezpieczeństwa.

Więc jakiej funkcji hashowej powinienem użyć w. NET?

  • użyj MD5, jeśli potrzebujesz prędkości/rozmiaru i nie dbasz o ataki urodzinowe lub ataki przedobrazowe.

Powtórz to za mną, 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 powinien być używany tam, gdzie trzeba bronić się przed atakami typu pre-image. to samo dotyczy SHA1 .

Należy pamiętać, że nie wszystkie algorytmy muszą bronić się przed atakami przed obrazem lub kolizją. Weźmy trywialny przypadek najpierw Szukaj duplikatów plików w HD.

  • Użyj funkcji opartej na SHA2XX, jeśli chcesz mieć kryptograficznie bezpieczną funkcję haszującą.
Nikt nie znalazł kolizji SHA512. Nigdy. Bardzo się starali. Nikt nigdy nie znalazł kolizji SHA256 lub 384. .
  • nie używaj SHA1 lub RIPEMD, chyba że jest to scenariusz interoperacyjności.

RIPMED nie otrzymał takiej kontroli jak SHAX I MD5 przyjąłem. Zarówno SHA1, jak i RIPEMD są podatne na ataki urodzinowe. Oba są wolniejsze niż MD5 na. Net i mają niewygodny Rozmiar 20 bajtów. Nie ma sensu korzystać z tych funkcji, zapomnij o nich.

SHA1 collision attacks są w dół do 2^52, to nie będzie zbyt długo, dopóki kolizje SHA1 są na wolności.

Aby uzyskać aktualne informacje o różnych funkcjach skrótu, zajrzyj do funkcji skrótu zoo .

But wait there is more

Mając funkcja skrótu fast może być przekleństwem. Na przykład: bardzo powszechnym zastosowaniem funkcji hashowych jest przechowywanie haseł. Zasadniczo obliczasz hash hasła połączonego ze znanym losowym ciągiem znaków (aby utrudnić ataki rainbow) i przechowujesz ten hash w bazie danych.

Problem polega na tym, że jeśli atakujący dostanie zrzut bazy danych, może całkiem skutecznie odgadnąć hasła za pomocą brute-force. Każda kombinacja, której spróbuje, zajmuje tylko ułamek milisekundy i może wypróbować setki tysięcy haseł na sekundę.

Aby obejść ten problem, można użyć algorytmu bcrypt , jest on zaprojektowany tak, aby był powolny, więc atakujący będzie mocno spowolniony, jeśli zaatakuje system za pomocą bcrypt. Ostatnio scrypt zrobił jakiś nagłówek i jest uważany przez niektórych za bardziej skuteczny niż bcrypt, ale nie znam implementacji.Net.

 100
Author: Sam Saffron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:50

Update:

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:

  1. RIPEMD uszkodzony, nigdy nie powinien być używany Jak widać w tym pdf
  2. MD-5 uszkodzony, nigdy nie powinien być używany, może być uszkodzony w 2 minuty z laptopem
  3. SHA-1 uszkodzony, nigdy nie powinien być używany, jest złamane w głównym, ataki są coraz lepsze z tygodnia
  4. SHA-2 słaby, prawdopodobnie zostanie uszkodzony w ciągu najbliższych kilku lat. znaleziono kilka słabości. zauważ, że im większy rozmiar klucza, tym trudniej jest złamać funkcję skrótu. Podczas gdy klucz size = strength nie zawsze jest prawdziwy, jest to głównie prawda. Więc SHA-256 jest prawdopodobnie słabszy niż SHA-512.
  5. Brak znanych słabości, jest kandydatem do SHA-3 . Jest to dość nowe, a więc nieprzetestowane. mA został zaimplementowany w kilku językach.
  6. MD6 Brak znanych słabości, jest kolejnym kandydatem do SHA-3. Prawdopodobnie silniejszy niż Skien, ale wolniejszy na maszynach jednordzeniowych. Podobnie jak Skien, nie jest testowany. Niektórzy programiści dbający o bezpieczeństwo używają go w rolach krytycznych dla misji .
Osobiście użyłbym MD6, bo nigdy nie można być zbyt paranoicznym. Jeśli chodzi o szybkość, spojrzę na Skeina, albo SHA-256.
 33
Author: Ethan Heilman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 07:20:45

To, którego używasz, zależy od tego, do czego go używasz. Jeśli chcesz się tylko upewnić, że pliki nie ulegną uszkodzeniu podczas transportu i nie martwią się o bezpieczeństwo, wybierz Szybki i mały. Jeśli potrzebujesz podpisów cyfrowych do wielomiliardowych federalnych umów ratunkowych i musisz upewnić się, że nie są sfałszowane, idź na trudne do sfałszowania i powolne.

 2
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 02:53:04

Na wykresie dziennym widać, że na wykresie dziennym widać, że na wykresie dziennym nie ma miejsca na wykresie dziennym.

Dopóki nie dbasz o ochronę przed kolizjami (nadal możesz bezpiecznie używać md5 również w HMAC) i chcesz prędkości (czasami chcesz wolniejszy hash), możesz nadal używać md5 pewnie.

 2
Author: Mike Boers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 02:53:54

W obronie MD5 nie jest znany sposób wytworzenia pliku z dowolnym skrótem MD5. Oryginalny autor musi zaplanować z wyprzedzeniem kolizję roboczą. Tak więc, jeśli odbiorca Ufa nadawcy, MD5 jest w porządku. MD5 jest uszkodzony, jeśli sygnatariusz jest złośliwy, ale nie wiadomo, czy jest podatny na ataki typu man-in-the-middle.

 2
Author: rlbond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 05:10:05

Dobrym pomysłem byłoby przyjrzeć się algorytmowi BLAKE2 .

Jak to opisano, jest szybszy niż MD5 i co najmniej tak samo bezpieczny jak SHA-3. Jest również zaimplementowany przez kilka aplikacji, w tym WinRar.

 1
Author: Florin Mircea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-21 21:33:58

Nie jestem ekspertem w tego typu sprawach, ale nadążam za społecznością bezpieczeństwa i wiele osób uważa, że hash md5 jest zepsuty. Powiedziałbym, że to, którego z nich użyć, zależy od tego, jak wrażliwe są dane i konkretna aplikacja. Być może uda ci się uciec z nieco mniej bezpiecznym Hashem, o ile klucz jest dobry i silny.

 0
Author: blueintegral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 02:54:47

Oto moje propozycje dla Ciebie:

  1. powinieneś zapomnieć o MD5, jeśli przewidujesz ataki. Istnieje wiele rainbow tables dla nich online, a korporacje takie jak RIAA są znane z tego, że są w stanie produkować sekwencje z równoważnymi hashami.
  2. Użyj soli jeśli możesz. Włączenie długości Wiadomości do wiadomości może bardzo utrudnić dokonanie użytecznej kolizji skrótu.
  3. zgodnie z ogólną zasadą, więcej bitów oznacza mniej kolizji (przez zasada pigeonhole) i wolniej, a może bezpieczniej (chyba że jesteś geniuszem matematyki, który potrafi znaleźć luki).

Zobacz tutaj artykuł opisujący algorytm tworzenia kolizji md5 w 31 sekund z komputerem stacjonarnym Intel P4.

Http://eprint.iacr.org/2006/105

 0
Author: Unknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-30 20:22:27