MD5
Az MD5 (Message-Digest algorithm 5) egy 128 bites, egyirányú kódolási algoritmus. Az RFC 1321-es internet szabványban foglaltak szerint használják internetes adatok kódolására, illetve titkosítási kulcsokban. Az MD5-kódolást biztonsági alkalmazások széles skálája használja adatellenőrzésre, például fájlok eredetiségének (sértetlenségének) vizsgálatára.
Az MD5-kódolást az RSA algoritmus megalkotóinak egyike, Ronald L. Rivest professzor fejlesztette ki 1991-ben az elavult MD4 lecserélésre. 1996-ban felfedeztek egy nem súlyos hibát az MD5 kódjában. Adatbiztonsági szakemberek ennek hallatán más hashelési algoritmusok használatát (például SHA-1) javasolták az MD5-tel szemben. 2004-ben további biztonsági rések láttak napvilágot, ami még inkább megkérdőjelezte az MD5 használatának megbízhatóságát.
2005 óta elektronikus aláírás területen használata nem javasolt, és 2010. december 31-ével az utódja, az SHA-1 algoritmus is kiváltandó az SHA-256 algoritmussal.
MD5 hashek
szerkesztésAz MD5 kódolás bármilyen adatból – függetlenül a méretétől, vagy a típusától – egy 16 bájt hosszú bináris hasht eredményez (32 hexadecimális számjeggyel írható le). A kódolás egyirányú, így nem lehet visszafejteni. Éppen emiatt alkalmas az eredetiség ellenőrzésére.
Például egy beléptető rendszer nem kell, hogy eltárolja az egyes felhasználók jelszavát, elég, ha csak azok vissza nem fejthető hashét rögzíti. A bejelentkezési kísérletnél a megadott jelszó hashét összehasonlítva az eredetileg tárolttal megkapjuk annak helyességét. A gyakorlatban a hash-t nem magából a jelszóból számoljuk ki, hanem egy véletlenszerű adat (a só) és a jelszó összekapcsolásával előállított stringre, hogy megnehezítsük a szótáralapú támadásokat. (Természetesen a só értékét is tárolni kell, hiszen az ellenőrzéshez is szükség van rá.)
A visszafejtésről
szerkesztésAz MD5 hashek visszafejtése nem lehetséges, léteznek azonban különböző online is elérhető adatbázisok, melyek kódolt adatokat, és a hozzájuk tartozó hasheket tartalmazzák.[1] Ilyen például az www.md5decrypter.com, ami jelenleg több mint 15 millió kódot és a hozzá tartozó jelentést tartalmazza.
Néhány példa
szerkesztésAz alábbi két szó csak egyetlen karakteren különbözik (a kódszavak Hamming-távolsága egy), a kapott MD5-hash azonban teljesen más:
MD5("majom"): bcb559cd9d05046da8ec6ea3175a834c MD5("bajom"): e20c0bddf6416a2021f18b6b05784e88
Az üres input MD5 értéke:
MD5(""): d41d8cd98f00b204e9800998ecf8427e MD5(NULL): d41d8cd98f00b204e9800998ecf8427e
Az MD5-algoritmus
szerkesztésPszeudokód
szerkesztés//Megjegyzés: minden változó előjelnélküli 32 bites, modulo 2^32 var int[64] r, k //az r a körönkénti eltolásszám r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22} r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20} r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23} r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21} //Az egészek szinuszainak bináris egész részének használata: for i from 0 to 63 k[i] := floor(abs(sin(i + 1)) × 2^32) //Változók beállítása: var int h0 := 0x67452301 var int h1 := 0xEFCDAB89 var int h2 := 0x98BADCFE var int h3 := 0x10325476 //Előkészületek: append "1" bit to message append "0" bits until message length in bits ≡ 448 (mod 512) append bit length of message as 64-bit little-endian integer to message //Az üzenetek 512 bites darabokban való értelmezése: for each 512-bit chunk of message break chunk into sixteen 32-bit little-endian words w[i], 0 ≤ i ≤ 15 //Ezekre a beállítás: var int a := h0 var int b := h1 var int c := h2 var int d := h3 //Fő ciklus: for i from 0 to 63 if 0 ≤ i ≤ 15 then f := (b and c) or ((not b) and d) g := i else if 16 ≤ i ≤ 31 f := (d and b) or ((not d) and c) g := (5×i + 1) mod 16 else if 32 ≤ i ≤ 47 f := b xor c xor d g := (3×i + 5) mod 16 else if 48 ≤ i ≤ 63 f := c xor (b or (not d)) g := (7×i) mod 16 temp := d d := c c := b b := ((a + f + k[i] + w[g]) leftrotate r[i]) + b a := temp //Ezt az eddigihez hozzáadni: h0 := h0 + a h1 := h1 + b h2 := h2 + c h3 := h3 + d var int digest := h0 append h1 append h2 append h3 //(little endianként)
Megvalósítások különböző nyelveken
szerkesztésJegyzetek
szerkesztés- ↑ Brian Jørgensen: MD5 Decryption (angol nyelven), 2004. július 21. [2008. október 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. október 26.)