it-swarm-eu.dev

Proč je použití soli bezpečnější?

Ukládání hash hesel uživatelů, např. v databázi je nejistá, protože lidská hesla jsou zranitelná vůči slovníkovým útokům. Všichni tvrdí, že se to zmírňuje použitím solí, ale sůl je považována za necitlivou a nemusí být chráněna.

V případě, že má útočník sůl, jak je jeho slovníkový útok obtížnější než dříve? Neodstraní účinně sůl a její užitečnost?

51
Jim

Sůl vás nechrání před osamělým útočníkem, který má pouze jedno heslo. Útočník, který chce pouze prolomit jedno heslo, vypočítá hash(salt + guess) namísto hash(guess) (pokud je schéma hesla hash(salt+password) ).

Sůl pomáhá, pokud útočník chce prolomit mnoho hesel. Obvykle tomu tak je. Útočník někdy útočí na web a chce se vloupat do účtu na tomto webu, libovolném účtu. Bez soli může být většina práce útočníka použita pro všechny účty, takže může otestovat každý ze svých pokusů proti všem účtům najednou. Při správně zvolená sůl (tj. Pokud žádné dva účty nemají stejnou sůl), musí útočník začít znovu pro každé hashované heslo.

Navíc, v jistém smyslu, všechny pokusy o praskání hesla se pokoušejí rozbít všechna hesla účtů najednou. Je to proto, že hash lze předem spočítat; stačí, aby někdo vygeneroval tabulku hashů - nebo efektivněji Rainbow tabulka - a počáteční práce může být distribuována více útočníkům, kteří ji mohou použít v jakékoli databázi účtů, která používá stejné algoritmus hashování hesla. Sůl opět činí tyto předběžné k ničemu.

Útok s hrubou silou hesla lze shrnout takto:

  1. Proveďte jakoukoli precomputaci, kterou útočník pokládá za užitečnou, například sestavení tabulky Rainbow (což je účinný způsob, jak reprezentovat hash mapování tabulky na běžná hesla).
  2. Pro každý z n účtů, které má útočník zájem o vloupání, a pro každý z p heslo hádá, že útočník ve svém slovníku zahrnuje, otestujte, zda hash(guess[i]) = hashed_password[j].

V naivním přístupu vyžaduje druhý krok n × p hash výpočty vyzkoušet všechny odhady proti všem účtům. Pokud však první krok již spočítal všechny možné hashe, pak druhý krok nevyžaduje výpočet hashů vůbec, pouze vyzkoušíte, zda každý hashed_password je v předkompilované databázi, takže útok vyžaduje pouze n vyhledání tabulek (to může být dokonce urychleno, ale už jsme z n x p pomalé výpočty¹ dolů na n vyhledávání tabulek).

Pokud má každé heslo jinou sůl, pak, aby to bylo užitečné, musí předběžná zpráva zahrnovat položku pro každou možnou hodnotu soli. Pokud je sůl dostatečně velká, je předběžné zpracování nemožné. Pokud předběžné zpracování sůl nezohledňuje, nebude užitečné urychlit druhý krok, protože jakákoli kryptografická hashovací funkce “ míchá ”jeho vstup: znát hash UIOQWHHXpassword nepomůže vypočítat hash NUIASZNApassword. Dokonce i za účelem útoku na jeden účet musí útočník provést p hash výpočty, aby vyzkoušel všechny odhady. pokud má útočník předkompilovaný slovník.

¹ Heslo by nemělo být uloženo jako hash, jako je SHA-1, ale pomocí pomalejší hashovací funkce, jako je bcrypt nebo scrypt nebo PBKDF2 .

Vysvětlím každou úroveň zabezpečení pro heslo uložené v databázi, možná to pomůže objasnit důležitost soli.

Úroveň 1 : Heslo uložené v databázi v databázi.

To je jen čistá hloupost . Ale někdy velká společnost dostane databázi kompromitovanou a, oh, překvapení, všechna hesla jsou uložena v jasném. Jaká škoda!

Úroveň 2 : Heslo uložené pomocí hashovacího algoritmu.

Toto je krok k větší bezpečnosti. Pokud útočník získá hashované heslo, nemůže se stále přihlásit pomocí tohoto pověření ke službě. Nejprve bude muset "zrušit" heslo pomocí Rainbow Table nebo brute nutí to . To znamená, že útočníkovi vyžaduje trochu více práce, ale stále je možné získat původní heslo.

Úroveň 3 : Heslo uložené pomocí hashovacího algoritmu se solí.

To začíná být zajímavé. Jak jsme viděli na úrovni 2 , útočník, který má přístup k heslu hashed, jej může buď hrubě přinutit, nebo použít tabulku Rainbow. Pokud přidáte sůl do původního hesla, bude tabulka Rainbow naprosto zbytečná , protože sůl neberou v úvahu. Stále je možné získat původní řetězec pomocí tabulky Rainbow, ale znamenalo by to, že v tabulce Rainbow existuje heslo + sůl. Protože sůl je obecně velmi dlouhá, je liché, které má hashovanou hodnotu řetězce (40+), téměř nemožné. Jediným zbývajícím řešením je hrubá síla.

Úroveň 4 : Heslo uložené pomocí hashovacího algoritmu se solí a peperem.

To je velmi zajímavé (to je důvod, proč posílám svou odpověď, protože ty skutečné jsou již zajímavé).

Doporučuji použít hashovací algoritmus jako BCrypt, SCrypt nebo PBKDF2, protože zatím nejsou roztrhané a jsou velmi pomalé na hackování, což prodlužuje čas na jejich zlomení a poté kompletní databázi hesel.

Rozdíl mezi solí a pepřem je jejich umístění. Sůl je obecně uložena v databázi, ale pepř je umístěn v kódu. To se může zdát divné, ale původní myšlenka je, že databáze může být ohrožena, ale ne kód, takže útočník nechává sůl a seznam zbytečného hashovaného hesla. Navíc přidává ještě více složitosti hashed hesla, takže Rainbow tabulky zcela k ničemu (pokud předpokládáme, že byly ještě trochu užitečné se solí!) .

V případě, že je ohrožena pouze databáze, pak je i hrubá síla k ničemu , protože útočník nehledá jednu hodnotu (původní heslo), ale pro dvě hodnoty (původní heslo a pepř).

16
Cyril N.

Pokud jsou vaše hashe nesolené, mohu vygenerovat celé slovníky, které mají hodnotu hashů, a ukládat je do databáze (speciální druh nazývaný tabulka Rainbow, je to efektivnější pro velké množství hashů), pak vše, co musím udělat, je vyhledat je. V podstatě jedna obří paměť vs. optimalizace času CPU. Také, pokud vidím dva uživatele se stejným hashem, vím, že používají stejné heslo.

Sůl dělá každý uživatel hash heslem jedinečným, a pokud to uděláte správně, bude to pravděpodobně jedinečné, i když používají stejné heslo na nějakém jiném webu (není neobvyklé), a tak bych vlastně musel vzít Word, použít sůl a hash, opakujte pro další záznam ve slovníku.

8
ewanm89

Nesolené hashe jsou náchylné k útokům vyhledávání. Existují volně dostupné databáze obsahující miliony hashů hesel (hlavně MD5 a SHA1), které lze použít k vyhledání prostého textu hashe. Ty mohou být založeny na standardních relačních databázích nebo na specializovaných formátech databáze, jako jsou tabulky Rainbow.

Zde je příklad:
7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53 (nesolené)
2d67062d67b4d0eaca31a768e901d04982de7352 (solené předponou "RxB6aE")

Rychlé vyhledávání na první hash odhalí holý text být "passw0rd". Není však pravděpodobné, že by byl nalezen. V případě, že útočník nezná sůl, je obtížné provést slovníkové a brutální útoky.

Pokud hledáte zabezpečená hesla v databázi, měli byste použít něco jako bcrypt. Používá velké množství iterací hash algoritmu, aby se každý výpočet zpomalil. Bruteforce útoky, slovníky útoky a budování Rainbow tabulek jsou jako takové velmi neuskutečnitelné.

6
Polynomial