MD5

A Wikipédiából, a szabad enciklopédiából

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és | forrásszöveg szerkesztése]

Az MD5 kódolás bármilyen adatból – függetlenül a méretétől, vagy a típusától – egy 32 karakter hosszú hexadecimális hasht eredményez. A kódolás egyirányú, így nem lehet visszafejteni. Éppen emiatt biztonságos, és kiválóan alkalmas eredetiség ellenőrzésre.

Például egy beléptető rendszer nem kell, hogy eltárolja az egyes felhasználók jelszavait, elég ha csak azok vissza nem fejthető 32 karakteres 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 visszafejtésről[szerkesztés | forrásszöveg szerkesztése]

Az MD5 hashek visszafejtése nem lehetséges, léteznek azonban különböző on-line 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és | forrásszöveg szerkesztése]

Az 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és | forrásszöveg szerkesztése]

Pszeudó-kód[szerkesztés | forrásszöveg szerkesztése]

//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és | forrásszöveg szerkesztése]

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

  1. Brian Jørgensen: MD5 Decryption (angol nyelven), 2004. július 21. (Hozzáférés: 2008. október 26.)