MD5

A Wikipédiából, a szabad enciklopédiából
(Md5 szócikkből átirányítva)

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.

Tartalomjegyzék

[szerkesztés] MD5 hashek

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 (szabadfordításban: zagyvalékot) 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.

[szerkesztés] A visszafejtésről

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 visszafejtést tartalmaz.

[szerkesztés] Néhány példa

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

[szerkesztés] Az MD5-algoritmus

[szerkesztés] Pszeudó-kód

//Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculating
var int[64] r, k

//r specifies the per-round shift amounts
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}

//Use binary integer part of the sines of integers as constants:
for i from 0 to 63
    k[i] := floor(abs(sin(i + 1)) × 2^32)

//Initialize variables:
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476

//Pre-processing:
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

//Process the message in successive 512-bit chunks:
for each 512-bit chunk of message
    break chunk into sixteen 32-bit little-endian words w[i], 0 ≤ i ≤ 15

    //Initialize hash value for this chunk:
    var int a := h0
    var int b := h1
    var int c := h2
    var int d := h3

    //Main loop:
    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

    //Add this chunk's hash to result so far:
    h0 := h0 + a
    h1 := h1 + b 
    h2 := h2 + c
    h3 := h3 + d

var int digest := h0 append h1 append h2 append h3 //(expressed as little-endian)

[szerkesztés] Megvalósítások különböző nyelveken

[szerkesztés] Jegyzetek

  1. Brian Jørgensen: MD5 Decryption (angol nyelven), 2004. július 21. (Hozzáférés: 2008. október 26.)
Személyes eszközök
Névterek
Változók
Műveletek
Navigáció
Részvétel
Nyomtatás/exportálás
Eszközök
Más nyelveken