MD5

kriptográfiai hash-függvény
Ez a közzétett változat, ellenőrizve: 2023. július 16.

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

Az 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 a jelszó összekapcsolásával előállított stringre, hogy megnehezítsük a szótáralapú támadásokat. (Természetesen a értékét is tárolni kell, hiszen az ellenőrzéshez is szükség van rá.)

A visszafejtésről

szerkesztés

Az 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és

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

Pszeudokó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és

https://rosettacode.org/wiki/MD5/Implementation

  1. 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.)

Külső hivatkozások

szerkesztés