Bcrypt

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Bcrypt je hašovací funkce pro odvození klíče (key derivation function) navržená Nielsem Provosem a Davidem Mazièresem. Je založena na šifře Blowfish a byla prezentována v USENIXu v roce 1999.[1] Bcrypt v sobě zahrnuje kryptografickou sůl, která chrání proti útokům pomocí duhové tabulky a mimo jiné se jedná o adaptivní funkci. To znamená, že můžeme záměrně zvýšit počet iterací, čímž dojde k jejímu zpomalení. Tím je zajištěna ochrana proti útokům hrubou silou.

Bcrypt je standardizovaná šifrovací funkce pro operační systémy jako BSD a další. Prefix „$2a$“ nebo „$2b$“ (případně „$2y$“) nacházející se v zašifrovaném řetězci označuje, že se jedná o modulární šifrovací formát.[2] Zbytek zakódovaného řetězce se skládá z parametru označujícího dobu šifrování, ze 128bitové kryptografické soli skládající se z 22 znaků zakódovaných šifováním base64 a ze 184 bitů výsledné šifrované hodnoty, rovněž zakódované pomocí funkce base64 do 31 znaků.[3]

Provos a Mazières využili Blowfish algoritmus a vylepšili jej. Vyvinuli pro něj nový algoritmus pro nastavení klíče a nazvali jej „Eksblowfish“. Ten začíná modifikovanou verzí původního algoritmu Blowfish, ve kterém jsou jak kryptografická sůl tak heslo použity pro nastavení všech podklíčů. V následných iteracích je již použit standardní algoritmus Blowfish, využívající střídavě sůl a heslo jako klíč. Každá z těchto iterací začíná podklíčem z předchozí iterace. Ačkoliv se jedná o vylepšení původního algoritmu, výsledná šifra je stejně silná. Jeho výhoda spočívá v umělém zpomalení výpočtu, díky čemuž dochází k lepší ochraně proti útokům hrubou silou.

Vstupem algoritmu je číslo n, určující počet iterací podle vztahu 2n. Toto číslo je součástí zakódovaného řetězce.

Funkce bcrypt je implementována v jazycích Ruby, Python, C, C#, Perl, PHP, Java, Node.js a dalších.

Algoritmus[editovat | editovat zdroj]

Bcrypt algoritmus velmi závisí na „Eksblowfish“ algoritmu nastavující klíč, který funguje následovně:

EksBlowfishSetup(cost, salt, key)
    state  InitState()
    state  ExpandKey(state, salt, key)
    repeat (2cost)
        state  ExpandKey(state, 0, key)
        state  ExpandKey(state, 0, salt)
    return state

InitState funguje jako originální Blowfish algoritmus, který naplňuje P-pole a S-boxy desetinnou částí čísla v hexadecimálním formátu. ExpandKey funkce dělá následující:

ExpandKey(state, salt, key)
    for(n = 1..18)
        Pn  key[32(n-1)..32n-1]  Pn 
    ctext  Encrypt(salt[0..63])
    P1  ctext[0..31]
    P2  ctext[32..63]
    for(n = 2..9)
        ctext  Encrypt(ctext  salt[64(n-1)..64n-1]) 
        P2n-1)  ctext[0..31]
        P2n  ctext[32..63]
    for(i = 1..4)
        for(n = 0..127)
            ctext  Encrypt(ctext  salt[64(n-1)..64n-1]) 
            Si[2n]  ctext[0..31]
            Si[2n+1]  ctext[32..63]
    return state

Proto ExpandKey(state, 0, key) je stejný jako rozvrhování klíče normálním algoritmem Blowfish, jelikož všechny funkce XOR s nulovou hodnotou soli nemají žádný efekt. Funkce ExpandKey(state, 0, salt) je podobná, ale používá sůl jako 128-bitový klíč. Celý bcrypt algoritmus využívá tyto funkce pro výpočet hashe z daného vstupu, který je odvozen z hesla. Celý algoritmus funguje následujícím způsobem:

bcrypt(cost, salt, input)
    state  EksBlowfishSetup(cost, salt, input)
    ctext  "OrpheanBeholderScryDoubt" 
    repeat (64)
        ctext  EncryptECB(state, ctext) 
    return Concatenate(cost, salt, ctext)

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku bcrypt na anglické Wikipedii.

  1. Provos, Niels; Mazières, David (1999).  "A Future-Adaptable Password Scheme". Proceedings of 1999 USENIX Annual Technical Conference: 81–92. 
  2. passlib.Modular Crypt Format
  3. BCrypt.

Externí odkazy[editovat | editovat zdroj]