it-swarm-eu.dev

Co by mělo být použito jako sůl?

Vždy slyším, že je nejlepší používat soli kromě uložených hesel, která se potom nějak zřetězí a hashují. Ale nevím co použít jako sůl. Co by byla dobrá sůl?

43
Sal

Řekněme, že máte tabulku, kde si uložíte heslo pro každou osobu.

Chcete-li „vygenerovat“ vygenerované heslo, postupujte následovně

  1. získat přihlášení od uživatele
  2. získat heslo
  3. generovat nějakou sůl z náhodných hodnot. Řekněme, že z/dev/random (jak navrhl @Michal), dostanete "a12bc34de56fg"
  4. K vygenerování hashovaného hesla použijte nějakou hashovací funkci. Řekněme, že původní heslo bylo „1password“ a použijete libovolné SHA hašování).

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))))))

Uložte do tabulky hashed_password s přihlašovacím jménem a solí.

login      password      salt
--------------------------------------
john       a7b82783...   a12bc34de56fg

Poté ověřte, kdy uživatel přistupuje k vaší aplikaci:

  1. získat přihlašovací jméno a heslo
  2. načtěte sůl z tohoto přihlášení z databáze (budete mít sůl: a12bc34de56fg)
  3. zřetězte obyčejné textové heslo solí a znovu proveďte všechny hašování:

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))))))

Ověřte, zda je vypočítané hashed_password stejné, jaké bylo uloženo v databázi. Budete vědět, zda bylo heslo správné nebo ne.

A je to!. Sůl můžete získat z libovolného náhodného zdroje, který se vám líbí. Proč by to mělo být náhodné? Vzhledem k tomu, že jakákoli jiná náhodná sůl bude mnohem snazší pokusit se brutálně vynutit vaši aplikaci.

13
woliveirajr

Klasické doporučení pro sůl pro hašování hesla je:

  • A náhodná hodnota 128 bitů nebo více ;
  • získané z kryptograficky zvukového generátoru náhodných čísel ( /dev/random nebo /dev/urandom v moderních Unixech);
  • jedinečný pro každou položku (tj. nepoužívejte znovu stejnou sůl, vygenerujte novou sůl pro každé nové heslo);
  • uložené v prostém textu v databázi (aby sůl byla k dispozici při ověřování hash).

Existuje spousta minulé diskuse o souvisejících tématech . A co je nejdůležitější, měli byste ne implementovat vlastní schéma hashování hesel - měli byste použít osvědčená, dobře otestovaná, recenzovaná implementace (bcrypt/PBKDF2) = =.

30
Jesper M

Odpověď zní „téměř cokoli“, i když některé jsou silnější než jiné.

Předpokládejme, že používáte md5 (salt.password).

Bez soli hackeři rychle prolomí většinu hesel pouhým vyhledáním hashe v tabulce Rainbow.

Řekněme, že jako sůl pro všechna vaše hesla používáte "x". Mnoho vašich hesel bude stále nalezeno, ale méně. Je to proto, že pokud je heslo „p4ssw0rd“, stává se ze soli „xp4ssw0rd“ se solí - což je o něco těžší, ale nikoli výrazně.

Řekněme, že používáte jako% Salt pro všechna vaše hesla „% X88Fc + 7“. V tuto chvíli nefungují tabulky Rainbow. V důsledku použití jedné soli pro všechna hesla však hacker bude schopen vygenerovat tabulku Rainbow s tímto předpokladem a postavit tabulky Rainbow předem. Je to mnohem bezpečnější, ale ne dokonalé.

Další nejbezpečnější možností je použít uživatelské jméno jako sůl, jinými slovy pomocí 'md5 (username.password)'. Znovu to poráží standardní tabulku Rainbow, ale hacker by mohl vygenerovat tabulku Rainbow pro konkrétní uživatelské jméno (jako „root“ nebo „administrator“), takže při každé změně hesla může hacker hledat v Rainbow místo toho, aby to znovu prasklo.

Chcete-li být ještě bezpečnější, vyberte jinou náhodnou sůl pro různé uživatele. Musíte to uložit spolu s hash uživatelským jménem a heslem. Tím se zcela překonají tabulky Rainbow.

Někteří navrhují spíše „bezpečný“ generátor náhodných čísel než něco jednoduchého. Například provádění MD5 (timestamp + username), když uživatel vytvoří účet, je jednoduché, ale není kryptograficky bezpečné (protože časová razítka a uživatelská jména jsou předvídatelná, a tedy nízká entropie). Ale protože hacker má přesto kopii soli, když ukradl databázi, není to problém.

10

Pro sůl stačí použít náhodné kousky.

V systému Linux můžete použít /dev/random. Je to generátor náhodných čísel jádra založený na okolním hluku. Je to docela nepředvídatelné, s výjimkou virtuálních strojů. Pokud tedy řeknete, že je k vaší krabici připojena fyzická myš, pak vám /dev/random Poskytne vysoce kvalitní náhodné kousky dobré pro sůl.

Zde je dobré článek začít. Viz také externí reference.

Zde je příklad Java kód . Podívejte se, jak je sůl generována a uložena v DB ve funkci createUser(). Kromě použití import Sun.misc. ... Je to velmi dobrý kód.

1
Michał Šrajer