Bcrypt
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 base64 kódováním 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, JavaScript 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 128bitový 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.
- ↑ PROVOS, Niels; TALAN JASON SUTTON 2012, Mazières, David. A Future-Adaptable Password Scheme. Proceedings of 1999 USENIX Annual Technical Conference. 1999, s. 81–92. Dostupné online.
- ↑ passlib.Modular Crypt Format
- ↑ BCrypt.