NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Hashovací funkce na hesla

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Zdeněk Pavlátka:30.5.2015 14:13

Zdravím, hodila by se mi rada, jakou hashovací funkci použít pro uchovávání hesel.

Odpovědět
30.5.2015 14:13
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Neaktivní uživatel:30.5.2015 14:18

SHA256/SHA512. Pokud by jsi chtěl něco exotičtějšího, pak RIPEMD-160 (ne klasický RIPEMD)

Nahoru Odpovědět
30.5.2015 14:18
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:30.5.2015 14:23

Nebo jakýkoliv RIPEMD, přepsal jsem se, chtěl jsem napsat 256.

Nahoru Odpovědět
30.5.2015 14:23
Neaktivní uživatelský účet
Avatar
Pavel Junek
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Pavel Junek:30.5.2015 14:46
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.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
30.5.2015 14:46
Avatar
Martin Dráb
Tvůrce
Avatar
Martin Dráb:30.5.2015 15:18

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ý.

Nahoru Odpovědět
30.5.2015 15:18
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Zdeněk Pavlátka:30.5.2015 15:29

"solení" znám, jen nevím co znamená to "hashovat iterativně". To je něco několikanásobný hash?

Nahoru Odpovědět
30.5.2015 15:29
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Michal Šmahel:30.5.2015 16:25

Já používám přímo PHP funkci password_hash().
Můžeš se na ni <a href="http://­php.net/manual/en/fun­ction.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);
Nahoru Odpovědět
30.5.2015 16:25
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Martin Dráb:30.5.2015 19:37

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.

Nahoru Odpovědět
30.5.2015 19:37
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Zdeněk Pavlátka
Dominik Klapuch:30.5.2015 20:35

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.

Nahoru Odpovědět
30.5.2015 20:35
Kód a data patří k sobě.
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Dominik Klapuch
Martin Dráb:30.5.2015 20:45

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

Nahoru Odpovědět
30.5.2015 20:45
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Zdeněk Pavlátka
Uživatel sítě :30.5.2015 20:52

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.. :)

Nahoru Odpovědět
30.5.2015 20:52
Chybami se člověk učí, běžte se učit jinam!
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Martin Dráb:30.5.2015 21:06

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.

Editováno 30.5.2015 21:10
Nahoru Odpovědět
30.5.2015 21:06
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Uživatel sítě :30.5.2015 21:17

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..

Nahoru Odpovědět
30.5.2015 21:17
Chybami se člověk učí, běžte se učit jinam!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.