MD5 | |
---|---|
Oprettet | 1991 _ |
offentliggjort | april 1992 _ |
Forgænger | MD4 |
Efterfølger | SHA-2 |
Standarder | RFC 1321 |
Hash størrelse | 128 bit |
Antal runder | fire |
Type | hash funktion |
MD5 ( Message Digest 5 ) er en 128 -bit hashing- algoritme udviklet af professor Ronald L. Rivest fra Massachusetts Institute of Technology (MIT) i 1991 . Designet til at skabe "fingeraftryk" eller beskedsammendrag af vilkårlig længde og derefter bekræfte deres ægthed. Det blev i vid udstrækning brugt til at kontrollere integriteten af information og gemme kodeords-hash.
MD5 er en af en række algoritmer for meddelelsesfordøjelse udviklet af professor Ronald L. Rivest fra Massachusetts Institute of Technology. Den blev udviklet i 1991 som en mere pålidelig version af den tidligere MD4-algoritme [1] . Beskrevet i RFC 1321 [2] . Senere fandt Hans Dobbertin fejl i MD4-algoritmen.
I 1993 viste Bert den Boer og Antoon Bosselaers, at pseudo-kollisioner er mulige i algoritmen, når forskellige initialiseringsvektorer svarer til de samme digests for inputmeddelelsen [3] .
I 1996 annoncerede Hans Dobbertin en kollision i algoritmen [4] , og allerede på det tidspunkt blev det foreslået at bruge andre hashing-algoritmer som Whirlpool , SHA-1 eller RIPEMD-160 .
På grund af den lille hash-størrelse på 128 bit, kan fødselsdagsangreb overvejes . I marts 2004 blev MD5CRK-projektet lanceret med det formål at opdage algoritmesårbarheder ved hjælp af fødselsdagsangrebet . MD5CRK-projektet sluttede den 17. august 2004, da Wang Xiaoyun , Feng Dengguo, Lai Xuejia og Yu Hongbo opdagede sårbarheder i algoritmen [5] .
Den 1. marts 2005 demonstrerede Arjen Lenstra , Wang Xiaoyun og Benne de Weger konstruktionen af to X.509- dokumenter med forskellige offentlige nøgler og den samme MD5-hash [6] .
Den 18. marts 2006 udgav forsker Vlastimil Klima en algoritme, der kan finde kollisioner på et minut på en normal computer, metoden kaldes "tunneling" [7] .
I slutningen af 2008 opfordrede US-CERT softwareudviklere, webstedsejere og brugere til at stoppe med at bruge MD5 til ethvert formål, da undersøgelser havde vist, at algoritmen var upålidelig [8] .
Den 24. december 2010 introducerede Tao Xie og Feng Dengguo først en one-block (512-bit) beskedkollision [9] . Tidligere blev der fundet kollisioner for beskeder på to eller flere blokke. Senere gentog Marc Stevens succesen ved at udgive blokke med den samme MD5-hash, samt en algoritme til at opnå sådanne kollisioner [10] .
I 2011 blev hvidbogen RFC 6151 udgivet . Han anerkender MD5 [2] hashing-algoritmen som usikker til nogle formål og anbefaler, at dens brug opgives til fordel for SHA-2.
Algoritmens input modtager en inputdatastrøm, hvis hash skal findes. Meddelelseslængden måles i bits og kan være hvad som helst (inklusive nul). Lad os skrive længden af beskeden i L . Dette tal er heltal og ikke-negativt. Antallet af tal er valgfrit. Efter dataene ankommer, begynder processen med at forberede strømmen til beregninger.
Nedenfor er de 5 trin i algoritmen [2] :
Først tilføjes en enkelt bit til slutningen af strømmen.
Derefter tilføjes et vist antal nul bit, således at den nye strømlængde bliver sammenlignelig med 448 modulo 512, ( ). Justering sker under alle omstændigheder, selvom længden af den originale strøm allerede er sammenlignelig med 448.
En 64-bit repræsentation af datalængden (antallet af bits i meddelelsen) tilføjes til slutningen af meddelelsen før justering. Først skrives de lave 4 bytes, derefter de høje. Hvis længden overstiger , tilføjes kun de mindst signifikante bits (svarende til at tage modulo ). Derefter vil længden af strømmen blive et multiplum af 512. Beregningerne vil være baseret på repræsentationen af denne datastrøm som et array af ord på 512 bit.
Til beregninger initialiseres fire 32-bit variabler, hvis begyndelsesværdier er angivet i hexadecimale tal ( little-endian byte rækkefølge ):
A = 01 23 45 67; // 67452301h B = 89 AB CD EF; //EFCDAB89h C = FE DC BA 98; // 98BADCFEh D = 76 54 32 10. // 10325476hDisse variabler vil gemme resultaterne af mellemliggende beregninger. Starttilstanden ABCD kaldes initialiseringsvektoren.
Lad os definere de funktioner og konstanter, vi har brug for til beregninger.
Vi indtaster element n fra rækken af 512-bit blokke i datablokken. Værdierne af A, B, C og D, der er tilbage efter operationer på de foregående blokke, gemmes (eller deres startværdier, hvis blokken er den første).
AA=A B.B.=B CC=C DD=DScene 1
/* [abcd ksi] a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ [ABCD 0 7 1][DABC 1 12 2][CDAB 2 17 3][BCDA 3 22 4] [ABCD 4 7 5][DABC 5 12 6][CDAB 6 17 7][BCDA 7 22 8] [ABCD 8 7 9][DABC 9 12 10][CDAB 10 17 11][BCDA 11 22 12] [ABCD 12 7 13][DABC 13 12 14][CDAB 14 17 15][BCDA 15 22 16]Etape 2
/* [abcd ksi] a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ [ABCD 1 5 17][DABC 6 9 18][CDAB 11 14 19][BCDA 0 20 20] [ABCD 5 5 21][DABC 10 9 22][CDAB 15 14 23][BCDA 4 20 24] [ABCD 9 5 25][DABC 14 9 26][CDAB 3 14 27][BCDA 8 20 28] [ABCD 13 5 29][DABC 2 9 30][CDAB 7 14 31][BCDA 12 20 32]Etape 3
/* [abcd ksi] a = b+ ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ [ABCD 5 4 33][DABC 8 11 34][CDAB 11 16 35][BCDA 14 23 36] [ABCD 1 4 37][DABC 4 11 38][CDAB 7 16 39][BCDA 10 23 40] [ABCD 13 4 41][DABC 0 11 42][CDAB 3 16 43][BCDA 6 23 44] [ABCD 9 4 45][DABC 12 11 46][CDAB 15 16 47][BCDA 2 23 48]Etape 4
/* [abcd ksi] a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ [ABCD 0 6 49][DABC 7 10 50][CDAB 14 15 51][BCDA 5 21 52] [ABCD 12 6 53][DABC 3 10 54][CDAB 10 15 55][BCDA 1 21 56] [ABCD 8 6 57][DABC 15 10 58][CDAB 6 15 59][BCDA 13 21 60] [ABCD 4 6 61][DABC 11 10 62][CDAB 2 15 63][BCDA 9 21 64]Vi opsummerer med resultatet af den foregående cyklus:
A=AA+A B=BB+B C=CC+C D=DD+DEfter afslutningen af cyklussen skal du kontrollere, om der stadig er blokke til beregninger. Hvis ja, så gå til næste element i arrayet ( n + 1) og gentag løkken.
Resultatet af beregningerne er i ABCD-bufferen, dette er hashen. Hvis vi udsender byte for byte, startende med den lave byte A og slutter med den høje byte D, så får vi en MD5-hash. 1, 0, 15, 34, 17, 18...
MD5-algoritmen er afledt af MD4. Endnu en runde blev tilføjet til den nye algoritme, nu er der 4 i stedet for 3 i MD4. Tilføjet en ny konstant for at minimere virkningen af inputmeddelelsen, i hver runde ved hvert trin, og hver gang konstanten er anderledes, summeres den med resultatet F og datablokken. Funktionen er ændret i stedet for . Resultatet af hvert trin føjes til resultatet af det foregående trin, på grund af dette er der en hurtigere ændring i resultatet. Til samme formål er mængden af skift på hver cirkel optimeret. Rækkefølgen af arbejdet med inputord i runde 2 og 3 er ændret [2] .
Hashen indeholder 128 bits (16 bytes) og er normalt repræsenteret som en sekvens af 32 hexadecimale cifre [12] .
Nogle hash-eksempler:
MD5("md5") = 1BC29B36F623BA82AAF6724FD3B16718Selv en lille ændring i inputmeddelelsen (i vores tilfælde med en bit: ASCII-tegn "5" med kode 35 16 = 00011010 1 2 erstattes af tegn "4" med kode 34 16 = 00011010 0 2 ) fører til en komplet ændring i hashen. Denne egenskab ved algoritmen kaldes lavineeffekten .
MD5("md4") = C93D3BF7A7C4AFE94B64E30C2CE39F4FEt eksempel på en MD5-hash for en "nul"-streng:
MD5("") = D41D8CD98F00B204E9800998ECF8427EI øjeblikket er der flere typer af "hacking" MD5-hash - valg af en besked med en given hash [13] [14] :
I dette tilfælde kan ordbogssøgning og brute-force-metoder bruges til at knække hashen af andre hash-funktioner (med mindre ændringer af algoritmen). I modsætning til dem kræver RainbowCrack præ-forberedelse af regnbuetabeller , som er skabt til en foruddefineret hash-funktion. Kollisionsdetektion er specifik for hver algoritme.
Du kan bruge programmerne PasswordsPro [15] , MD5BFCPF [16] , John the Ripper til fuld opregning eller ordbogsoptælling . Der findes færdige ordbøger til at sortere i ordbogen [17] . Den største ulempe ved denne type angreb er den høje beregningsmæssige kompleksitet.
RainbowCrack er en anden metode til at finde forbilledet af en hash fra et givet sæt. Det er baseret på generering af kæder af hashes for at søge efter en given hash ved hjælp af den resulterende database. Selvom skabelsen af regnbueborde tager meget tid og hukommelse, er den efterfølgende revnedannelse meget hurtig. Hovedideen med denne metode er at opnå et kompromis mellem tabelopslagstid og hukommelsesfodaftryk .
En hash-kollision får den samme funktionsværdi for forskellige meddelelser og en identisk startbuffer. I modsætning til kollisioner er pseudo -kollisioner defineret som ens hashværdier for forskellige værdier af den indledende buffer, og selve beskederne kan være ens eller forskellige. I MD5 er spørgsmålet om kollisioner ikke løst [14] .
I 1996 fandt Hans Dobbertin pseudo-kollisioner i MD5 ved hjælp af visse ikke-standard initialiseringsvektorer . Det viste sig, at det er muligt at bygge en anden besked til en kendt besked, sådan at den vil have samme hash som den originale. Ud fra et matematisk synspunkt betyder det: MD5(IV,L1) = MD5(IV,L2), hvor IV er startværdien af bufferen, og L1 og L2 er forskellige meddelelser. For eksempel, hvis vi tager startværdien af bufferen [4] :
A=0x12AC2375 B=0x3B341042 C=0x5F62B97C D=0x4BA763Eog indstil inputmeddelelsen
AA1DDABE | D97ABFF5 | BBF0E1C1 | 32774244 |
1006363E | 7218209D | E01C136D | 9DA64D0E |
98A1FB19 | 1FAE44B0 | 236BB992 | 6B7A779B |
1326ED65 | D93E0972 | D458C868 | 6B72746A |
derefter ved at tilføje et tal til et bestemt 32-bit ord i blokbufferen, kan du få en anden besked med den samme hash. Hans Dobbertin introducerede følgende formel:
Derefter MD5(IV, L1) = MD5(IV, L2) = BF90E670752AF92B9CE4E3E1B12CF8DE.
I 2004 annoncerede de kinesiske forskere Wang Xiaoyun Yu Hongbo en sårbarhed, de havde opdaget i en algoritme, der gjorde det muligt for dem atogLai Xuejia, Feng Dengguo, ) finde kollisioner [5] [18] .
I 2005 udgav Wang Xiaoyun og Yu Hongbo fra Shandong University i Kina en algoritme, der kan finde to forskellige 128-byte-sekvenser, der producerer den samme MD5-hash. Et af disse par (særskilte bits fremhævet):
d131dd02c5e6eec4693d9a0698aff95c | 2fcab5 8 712467eab4004583eb8fb7f89 |
55ad340609f4b30283e4888325 7 1415a | 085125e8f7cdc99fd91dbd f 280373c5b |
d8823e3156348f5bae6dacd436c919c6 | dd53e2 b 487da03fd02396306d248cda0 |
e99f33420f577ee8ce54b67080 a 80d1e | c69821bcb6a8839396f965 2b6ff72a70 _ |
og
d131dd02c5e6eec4693d9a0698aff95c | 2fcab5 0 712467eab4004583eb8fb7f89 |
55ad340609f4b30283e4888325 f 1415a | 085125e8f7cdc99fd91dbd 7 280373c5b |
d8823e3156348f5bae6dacd436c919c6 | dd53e2 3 487da03fd02396306d248cda0 |
e99f33420f577ee8ce54b67080 2 80d1e | c69821bcb6a8839396f965 a b6ff72a70 |
Hver af disse blokke giver en MD5-hash på 79054025255fb1a26e4bc422aef54eb4 [19] .
I 2006 udgav den tjekkiske forsker Vlastimil Klima en algoritme, der gør det muligt at finde kollisioner på en konventionel computer med enhver initial vektor (A,B,C,D) ved hjælp af en metode, han kaldte " tunneling " [7] [20] .
MD5-algoritmen bruger den iterative Merkle-Damgor-metode , så det bliver muligt at bygge kollisioner med det samme, forudvalgte præfiks. På samme måde opnås kollisioner ved at tilføje det samme suffiks til to forskellige præfikser, der har samme hash. I 2009 blev det vist, at der for to forudvalgte præfikser kan findes specielle suffikser, med hvilke beskeder vil have samme hashværdi. Kompleksiteten af et sådant angreb er kun 2 39 hash-beregninger [21] .
Metoden af Wang Xiaoyun og Yu HongboMetoden af Wang Xiaoyun og Yu Hongbo bruger det faktum, at MD5 er bygget på den iterative Merkle-Damgor metode. Inputfilen udfyldes først, så dens længde er et multiplum af 64 bytes, derefter opdeles den i blokke på hver 64 bytes , , , . Dernæst beregnes sekvensen af 16-byte tilstande , , ifølge reglen , hvor er en eller anden fast funktion. Starttilstanden kaldes initialiseringsvektoren .
Metoden gør det muligt for en given initialiseringsvektor at finde to par og , sådan at . Denne metode virker for enhver initialiseringsvektor, ikke kun standardvektoren.
Dette angreb er en variation af differentialangrebet , som i modsætning til andre angreb af denne type bruger heltalssubtraktion frem for XOR som forskelsmål. Ved søgning efter kollisioner bruges meddelelsesmodifikationsmetoden: først vælges en vilkårlig meddelelse , derefter modificeres den efter nogle regler formuleret i artiklen, hvorefter hash-funktionsdifferentialet i øvrigt beregnes med sandsynlighed . Til og anvende kompressionsfunktionen for at kontrollere for kollisionsforhold; derefter vælges en vilkårlig , modificeret, en ny differens beregnes, lig med nul med sandsynlighed , og ligheden af hash-funktionen differens til nul betyder blot tilstedeværelsen af en kollision. Det viste sig, at efter at have fundet et par og , kan du kun ændre de to sidste ord i , derefter for at finde et nyt par og , kun om hashing-operationer kræves [19] .
Ved at anvende dette angreb på MD4 kan du finde en kollision på mindre end et sekund. Det gælder også for andre hash-funktioner såsom RIPEMD og HAVAL [5] .
Tidligere mente man, at MD5 giver dig mulighed for at få en relativt pålidelig identifikator for en datablok. I øjeblikket anbefales denne hash-funktion ikke til brug, da der er måder at finde kollisioner med acceptabel beregningskompleksitet [14] [22] .
Egenskaben hash unikke er meget brugt i forskellige områder [23] . De angivne eksempler gælder også for andre kryptografiske hashfunktioner .
Ved at bruge MD5 kontrollerede vi integriteten og ægtheden af de downloadede filer - for eksempel kommer nogle programmer med en kontrolsumværdi . For eksempel pakker til installation af gratis software [24] .
MD5 blev brugt til hashing af password. I et UNIX -system har hver bruger en adgangskode, og kun brugeren kender den. Hashing bruges til at beskytte adgangskoder. Det blev antaget, at den eneste måde at få det rigtige kodeord på var ved en udtømmende søgning. Da UNIX dukkede op, var DES (Data Encryption Standard) den eneste hashmetode , men kun amerikanske beboere kunne bruge den , fordi DES -kildekoder ikke kunne tages ud af landet. FreeBSD løste dette problem. Amerikanske brugere kunne bruge DES- biblioteket , og andre brugere har den tilladte metode til eksport. Derfor begyndte FreeBSD at bruge MD5 som standard. [25] . Nogle Linux- systemer bruger også MD5 til at gemme adgangskoder [26] .
Mange systemer bruger databaser til at godkende brugere, og der er flere måder at gemme adgangskoder på [27] :
Der er flere tilføjelser til MD5.
Hash funktioner | |
---|---|
generelle formål | |
Kryptografisk | |
Nøglegenereringsfunktioner | |
Tjek nummer ( sammenligning ) | |
Hashes |
|