it-swarm-eu.dev

Jaká je s PBKDF2 optimální velikost hash v bytech? A co velikost soli?

Při vytváření hash pomocí PBKDF2 umožňuje vývojáři zvolit velikost hash. Je už vždy lepší? A co velikost náhodné soli? Měla by být stejná jako hash?

ÚPRAVA: Zejména v hashovacích heslech.

27
blesh

Pro hašovací funkci chcete použít funkci, pro kterou je nejúčinnějším typem platformy (ten, který bude produkovat více hašovacích výpočtů za sekundu a za dolar), stroj, který chcete použít (tj. PC). Je to proto, že se účastníte závodů se zbraněmi s útočníkem a útočník si může koupit další druhy hardwaru, aby získal Edge nad vámi (například GPU). GPU jsou velmi dobré v 32bitové aritmetice, ale ne v 64bitové aritmetice, zatímco počítač (v 64bitovém režimu) bude u posledního velmi rychlý.

Použijte tedy hashovací funkci, která běží na 64bitových aritmetických operacích. To ukazuje na SHA-512 .

PBKDF2 je funkce odvození klíče : vytváří výstup konfigurovatelné velikosti. Pro hašování hesel chcete, aby velikost byla dostatečně velká, aby odradila generické útoky předimage (tj. Vyzkoušeli náhodná hesla, dokud nebude nalezena shoda), takže by to vyžadovalo, řekněme, alespoň 80 bitů výstupu. Pokud pouze pro zvýšení přesvědčivosti zabezpečení pro nežádoucí a také pro estetiku, jděte na další sílu 2: a 128bitový výstup . Není užitečné jít dál.

Sůl musí být jedinečná - pokud možno jedinečná. Snadný způsob, jak dosáhnout jedinečných hodnot solí, je generovat soli s kryptograficky silným PRNG : pravděpodobnost opakovaného použití hodnoty soli bude dostatečně nízká, aby byla zanedbána, pokud jsou tyto náhodné soli dostatečně velké, a „dostatečně velké“ "znamená" 128 bitů ". Použijte tedy náhodné 128bitové soli .

Osobně jsem raději bcrypt před PBKDF2 pro hashování heslem.

24
Thomas Pornin

Podle standardu PBKDF2 je minimální doporučená velikost soli 64 bitů, i když osobně bych doporučil 128 bitů nebo vyšší pro slušnou bezpečnostní rezervu. Velikost soli je nezávislá na vašem výběru hashe.

Pokud jde o zabezpečení, doporučujeme vybrat odvozenou délku klíče alespoň stejnou velikost výstupu vaší soli, s minimem 256 bitů. Jakákoli velikost hash menší než 256 bitů je pod bezpečnostní hranicí nejmodernějších hash funkcí.

Výběr odvozené délky klíče, která je menší než výstupní délka hashovací funkce, nemá smysl, pokud nepoužíváte klíč pro blokovou šifru, která nedokáže zpracovat klíč této velikosti.

Pokud jde o optimální zabezpečení, navrhl bych SHA-512 jako PRF, s klíčem odvozeným 512 bitů, 128bitovou solí a tolika iteracemi, jaké může vaše situace zaručit.

11
Polynomial

V případě, že je vaše platforma .NET, existuje článek OWASP speciálně věnovaný jeho Rfc2898DeriveBytes třídě. Konkrétně poznámka (důraz důl):

Vestavěná implementace .NET Rfc2898DeriveBytes omezuje uživatele na jednu psudorandom funkci - HMAC s SHA-1 . To je dnes ve většině scénářů přijatelné, ale v budoucnu může být zapotřebí složitější hašovací funkce.

Při použití hesla PBKDF2 pro ukládání hesel byste nikdy neměli vydávat více bitů, než je velikost základní hashovací funkce. U PBKDF2-SHA1 je to 160 bitů nebo 20 bajtů . Výstup více bitů nezajišťuje bezpečnější hash, ale stojí obránce mnohem více času, aniž by to stálo útočníka. Útočník pouze porovná první výstup velikosti hašovací funkce, což jim ušetří čas na vygenerování resetování výstupu PBKDF2.

Mají také vzorek kódu, který jsem upravil podle pokynů ostatních odpovědí:

public static string Hash(string str)
{
    // Generate the hash, with an automatic 16 byte salt
    using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(str, 16))
    {
        rfc2898DeriveBytes .IterationCount = 10000 // or whatever you can afford
        byte[] hash = rfc2898DeriveBytes.GetBytes(20);
        byte[] salt = rfc2898DeriveBytes.Salt;
        return Convert.ToBase64String(salt) + "|" + Convert.ToBase64String(hash);
    }
}
4
Ohad Schneider