Diskuze: Hashovací funkce na hesla
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
SHA256/SHA512. Pokud by jsi chtěl něco exotičtějšího, pak RIPEMD-160 (ne klasický RIPEMD)
Nebo jakýkoliv RIPEMD, přepsal jsem se, chtěl jsem napsat 256.
hash($hash, $password);
první parametr ($hash) je algoritmus, nejčastěji se používá asi sha512 (patří k nejbezpečnějším). Druhý parametr ($password) je textový řetězec, který chceš zahashovat.
Libovolná funkce z rodiny SHA-2 bude stále dobrou volbou, řekl bych. Pro vyšší bezpečnost bys měl heslo posolit (prakticky zmaří útok přes rainbow tabulky, navíc odliší entity se stejnými hesly) a hashovat iterativně (útočníkovi dá velkou práci si nějaké ty hashe předpočítat, to samé platí o útoku hrubou silou). Výhodu ale oceníš hlavně v případě, kdy se ti k hashům hesel dostane někdo nepovolaný.
"solení" znám, jen nevím co znamená to "hashovat iterativně". To je něco několikanásobný hash?
Já používám přímo PHP funkci password_hash().
Můžeš se na ni <a
href="http://php.net/manual/en/function.password-hash.php">podívat</a>.
Většinou sůl dělám proměnnou pomocí nějaké vlastnosti (jméno,
příjmení, ...)
<?php
//Sůl ze tří částí
$salt = parlibovolnychznaku . hash("sha-512", $surname) . parlibovolnychznaku;
//Nastavení hashe
$options = [
'cost' => 12,
'salt' => $salt,
];
//Zahashování hesla
$finalPassword = password_hash($password, PASSWORD_BCRYPT, $options);
solení" znám, jen nevím co znamená to "hashovat iterativně". To je něco několikanásobný hash?
Ano, znamená to aplikovat hashovací funkci na heslo několikanásobně.
hash(hash(...hash($heslo,...)...)
Cílem je ztížit útočníkovi výpočet hashů z hesel (klidně můžeš hashovat třeba 512krát) tak, že pro něj bude časově dost náročné. Jelikož heslo ověřuješ jen při přihlášení uživatele, neznamená pro tebe taková časová náročnost žádný problém (při přihlášení si uživatel počká o trošku déle, ale to by neměl být problém).
Ta funkce password_hash by něco takového možná mohla umět, nevím.
Ahoj,
je dobré používat funkci password_hash s PASSWORD_DEFAULT
konstantou. Dále jako ochranu používám symetrické šifrování pomocí
AES(Rijndael) s 256 bitovým klíčem a CBC modem. Klíč si uchováš někde
mimo databázi, třeba v nějakým konfiguračním souboru u sebe na hostingu,
který poté použiješ jak při vytváření či kontroly hesla. Člověk,
který by se ti náhodou dostal do databáze a nebude mít tento klíč (256
bitový) nemá prakticky šanci zjistit plain text hesel. Na netu určitě
najdeš kód na AES-256-CBC pro PHP.
Možná by na toto stačilo rozšíření mcrypt (mohlo by být
nainstalované na většině hostingů).
http://php.net/…-encrypt.php
Souhlasím s Michal Šmahel jeho řešení je nejideálnější v dnešní době.
Také je dobré ještě výsledný hash zašifrovat jak radí Dominik Klapuch (mcrypt_encrypt), kde použiješ klíč, který bude někde v bezpečí (konfigurační soubor, apod..) nikoliv databázi.
Martin Dráb: Několika násobný hash je naprostá hloupost, pokud to zacyklíš tak si spíže ještě více zavaříš (znehodnotíš samostatný hash). Je to chyba, které se dá předejít tím, že použiješ co použít máš (Password_hash či crypt s algoritmem bcrypt nebo blowfishem).
Sůl, slouží aby hashe stejných hesel nevypadaly stehně (hash ahoj = hash ahoj), u password_hash mám rád to, že si tato funkce vytvoří sůl sama pro každého uživatele. Takže se nemusíš starat o tuto drobnost. Je zkrátka nejlepší nechat vygenerování soli na tom kdo ví jak na to..
Martin Dráb: Několika násobný hash je naprostá hloupost, pokud to zacyklíš tak si spíže ještě více zavaříš (znehodnotíš samostatný hash). Je to chyba, které se dá předejít tím, že použiješ co použít máš (Password_hash či crypt s algoritmem bcrypt nebo blowfishem).
Máš nějaký zdroj k tomuto tvrzení? Je pravda, že iterativní hashování zvyšuje pravděpodobnost kolize, ale ne zásadně (zůstane pořád zanedbatelná). Co se týče práce s hesly, během let jsem několikrát četl doporučení pro iterativní hashování (případně v dalších iteracích přidávat ještě nějaký další vstup). Myslím, že existuje i nějaký standard, ale už se napamtuju, jakou má zkdratku a nemůžu to vygooglit.
EDIT: Aha, jedná se o PBKDF-2, i když účel tam přímo není generování jenom hashů z hesel.
V dnešní době to prostě není ani nutné, už máš slušné funkce pro uchování hesel. Stále tvrdím, že cyklení hashů je hloupost, používej to co k tomu je určené, nic jiné..
Kdysi četl já to zase kdysi slyšel na přednášce. Používej si co chceš, ale ostatním to nedoporučuj, protože když i použiješ rychlí hash tak cyklování ti stejně nepomůže..
Zobrazeno 13 zpráv z 13.