it-swarm-eu.dev

Je heslo HMAC-ed bezpečnější než bcryptované nebo scryptované heslo?

Vzhledem k možnosti, kterou si mám vybrat, HMAC pro bezpečné uložení hesla nebo knihovny bcrypt nebo scrypt?

25
user917279

Abychom vám poskytli správnou představu o problémech a jemnostech výpočtu hashů hesel a také o tom, proč HMAC není pro tento problém vhodný, poskytnu mnohem širší odpověď, než je skutečně nutné pro přímou odpověď na otázku.

Algoritmus hash HMAC je v podstatě pouze klíčovou verzí normálního hash algoritmu. Obvykle se používá k ověření integrity a pravosti. Obvyklý zápis je H(m,k) = h, kde H je hashovací algoritmus HMAC, m je zpráva, k je klíč a h je výsledný hash. Myšlenka je, že dvě strany, které sdílejí tajemství k, mohou ověřit, že druhá osoba je autorem m. Útočník dále nemůže vytvořit hash zprávy, aniž by věděl k.

To se provádí takto:

  1. Alice a Bob oba znají sdílený tajný klíč k.
  2. Alice píše zprávu m a vypočítá ji hash HMAC pomocí k, tj. H(m,k) = h.
  3. Alice pošle zprávu m a hash h Bobovi.
  4. Bob vypočítá H(m,k) a porovná ji s hash h, které Alice poslala. Pokud se hash shoduje, ví, že Alice poslala zprávu a že se nezměnila poté, co ji hashovala.

Nyní, když chápete, co je HMAC, pojďme se přesunout k tomu, co chcete opravdu - ukládat hesla do databáze.

Před mnoha lety bylo běžnou praxí ukládat hesla v prostém textu do databází. To byl špatný nápad, protože když byla databáze ohrožena, útočník dostal všechna hesla. Abychom tomu zabránili, začali jsme hashovací hesla v databázi používat jednosměrné kryptografické hashovací algoritmy. MD5 se stal populárním, ale slabiny (kolize, částečná preimage atd.) Objevené v něm znamenají, že se již nedoporučují. Mnoho lidí se přesunulo na SHA1, což je bezpečnější.

Problém s tímto přístupem je v tom, že je možné vytvořit obrovskou tabulku hashů a jejich odpovídajících holých textů. Nazývají se Duhové tabulky . Pracují na koncepci, že je efektivnější spočítat obrovský seznam hashů pro všechna možná hesla (v určité sadě) a poté je uložit, takže je lze později rychle zeptat. Takže namísto krutého vynucení jednotlivých hashů bylo možné pouze dotazovat databázi na hash a okamžitě nechat svůj prostý text vrátit.

Aby to bylo možné napravit, vynalezli bezpečnostní hlupáci soli. Soli jsou velké jedinečné náhodné hodnoty připojené k heslům před jejich hashováním. Tato sůl je uložena s hashem, takže ji lze později vypočítat znovu. Vypočítáme tedy H(m+s) = h a uložíme do databáze h a s. Toto poskytuje významnou ochrana před tabulkami Rainbow , protože v podstatě vyžaduje, aby byla pro každou sůl vygenerována samostatná tabulka Rainbow.

Špatní chlapi se tedy přepnuli na slovní útoky a praskání hrubou silou. S příchodem výpočetní techniky GPU bylo možné spočítat miliardy hašišů za sekundu na středně silné grafické kartě. Ve skutečnosti lidé stavěli počítače, které umí vypočítat téměř 50 miliard hashů MD5 za sekund - docela působivé/děsivé. Důvodem, proč jsou GPU schopny, je to, že jsou navrženy pro velké množství paralelních skalárních operací. Skalární operace jsou matematické a logické operace, které nezahrnují větve - tj. Nemusejí dělat mnoho/žádné „pokud x pak dělat y“. Kryptografické hashovací algoritmy mají sklon zapadat do tohoto modelu.

Abychom to ztížili, musíme provést hashovací operaci natolik pomalou, aby brutální nutkání nebylo možné. Normální hashovací algoritmy (např. SHA1) jsou navrženy tak, aby byly rychlé, což je činí nevhodnými pro tento účel. HMAC přidává jen velmi málo režijních nákladů a žádné zvláštní bezpečnostní rezervy, takže také zde není moc využito.

Vytvoření pomalého kryptografického hashova- cího algoritmu se snadněji říká, než udělá - je velmi obtížné přijít s takovým, který je pomalý, ireducibilní (tj. Nemůže být optimalizován nad jeho současný stav) a bezpečný. Existují tři populární hašovací funkce, které to mohou udělat: PBKDF2 , bcrypt a scrypt . Tito jsou známí jako adaptivní funkce odvození klíčů, protože přijímají hodnotu pracovního faktoru spolu s prostým textem a solí. Pracovní faktor mění dobu potřebnou k výpočtu hashe a je navržen tak, aby chránil před budoucím hardwarovým vylepšením.

Takže pro adaptivní algoritmus odvození klíče H vypočítáme H(m,s,w) = h, kde m je zpráva (heslo), s je sůl a w je pracovní faktor. Výsledný h obvykle obsahuje s a w, takže ověřovací funkce může později vypočítat stejný hash pomocí stejných parametrů. Pracovní faktor obecně řídí počet iterací prováděných interním kryptografickým primitivem. Cílem je, aby výpočet trval dostatečně dlouho, aby bylo možné popraskat, ale nepřekročit zdroje, které máme.

Aby bylo zajištěno vyšší zabezpečení proti vyhrazenému hardwarovému praskání, šifrování zajišťuje, že výpočet hash je jak CPU tak tvrdý na CPU, tj. Vyžaduje značné prostředky CPU a paměti, aby se vytvořila hašovací hodnota. To je důležité, protože FPGA obvykle mají přístup k velmi malé okamžité paměti.

Nyní vyvstává zřejmá otázka: Pokud nastavím svůj web tak, aby používal bcrypt, nebude to znamenat, že můj server musí neustále vypočítávat hash náročné na CPU? Pokud je spustíte na serveru, pak ano, to je něco, co je třeba vzít v úvahu. Lepším řešením je nechat klienta vypočítat hash a poslat jej na server přes SSL. Server ji pak může porovnat s hodnotou v databázi. Tím je zajištěno, že hash hesla nelze snadno rozbít, pokud je odcizen (např. Kompromitováním databáze) a že váš server není ohromen výpočtem režie hash hesla. Pro weby můžete použít jsBcrypt .  Aktualizace: Tato metoda byla upozorněna na vadu komentátora níže. Nepoužívejte to.

Doufejme, že vám to poskytne dobrý přehled o situaci a proč HMAC není vhodný pro tento druh použití.

37
Polynomial

HMAC je ověřovací kód zprávy ; používá klíč. Bcrypt ne. Volba tedy není neutrální; nemůžete myslet na to, že všechny věci jsou jinak stejné, protože nejsou.

Ačkoli nominálně pro kontrolu integrity, stává se tak, že HMAC (při použití s ​​přiměřeně bezpečnou hashovací funkcí, například SHA-256 nebo dokonce SHA-1) se chová nějak jako „hashovací funkce s klíčem“. Toto není obecná vlastnost MAC algoritmů, ale pracuje s HMAC (proto může být použit jako základ pro náhodný generátor nazvaný Hmac_DRBG ). Díky tomu je HMAC potenciální volbou pro hashování heslem.

Pokud "hash" své heslo s HMAC a útočník mohl chytit svůj soubor/databázi hashed heslo , ale ne klíč HMAC , pak útočník nemůžete rozbít hesla. V tomto scénáři je HMAC „lepší“ než bcrypt/scrypt. Toto je však případ Edge. Máme hash hesla, protože se obáváme okrajových scénářů, kdy útočník mohl narušit zabezpečení dost, aby získal pouze pro čtení přístup k části serverových souborů, ale ne read-write přístup. Metoda hash-with-HMAC je pro scénář hranatých čtverců, kdy útočník jen pro čtení může získat hashovací heslo, ale ne klíč, který je přesto uložen na stejném serveru.

Pokud by útočník mohl získat klíč, HMAC se pro něj stane pouze jednoduchou hashovací funkcí, a v tom případě je HMAC mnohem horší než bcrypt, protože je nesolený a příliš zatraceně rychlý. Je to jako kdyby hesla byla hashovaná párem vyvolání SHA-1. Tento scénář není o nic méně pravděpodobný než předchozí, a proto musíme použít HMAC samotné jako příliš riskantní .


Pro nejlepší z obou světů aplikujte HMAC na uživatelské heslo, a pak zpracovejte výstup HMAC pomocí bcrypt ; uložíte výstup bcrypt. Protože implementace bcrypt očekávají heslo jako řetězec znaků, budete muset kódovat výstup HMAC (hexadecimální, Base64 ...).

To je složitější než samotný bcrypt, protože používá dvě funkce namísto jedné, a kvůli klíči (což přináší celou trnitou otázku správy klíčů: generování, ukládání, zálohování ...). Protože složitost je špatná, doporučuji proti ní; jednoduše použijte bcrypt samostatně a nepřidávejte HMAC. To je však vaše volání; pokud opravdu chcete HMAC, použijte ho kromě bcrypt, ne místo bcrypt.

(Poznámka: to je bcrypt na výstupu HMAC, ne naopak, což by nefungovalo kvůli soli, která je součástí výstupu bcrypt.)

9
Thomas Pornin

HMAC je navržen tak, aby byl velmi rychlý a je v této souvislosti dobrým způsobem, jak přidat sůl k heslu namísto pouhého připojení. Bcrypt je mnohem pomalejší kvůli pomalé inicializaci, zatímco scrypt je dokonce pomalejší než Bcrypt, protože je záměrně navržen tak. Scrypt je navržen tak, aby ho brutální nutil velmi výpočetně drahý. To spotřebovává hodně CPU, paměti a je také pomalé použití na GPU.

Více o scrypt

2
Matrix