Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

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
Filip Šohajek
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Filip Šohajek:

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

 
Nahoru Odpovědět  -1 30.5.2015 14:18
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na Filip Šohajek
Filip Šohajek:

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

 
Nahoru Odpovědět 30.5.2015 14:23
Avatar
Pavel Junek
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Pavel Junek:
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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 30.5.2015 14:46
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

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
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Martin Dráb
Zdeněk Pavlátka:

"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 (ceskyDJ):

Já používám přímo PHP funkci password_hash().
Můžeš se na ni podívat.
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  +1 30.5.2015 16:25
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Martin Dráb:

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  -1 30.5.2015 19:37
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Zdeněk Pavlátka
Dominik Klapuch:

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  +2 30.5.2015 20:35
Kód a data patří k sobě.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Dominik Klapuch
Martin Dráb:

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  -1 30.5.2015 20:45
2 + 2 = 5 for extremely large values of 2
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Marek Z.:

Souhlasím s Michal Šmahel (ceskyDJ) 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  +1 30.5.2015 20:52
Chybami se člověk učí, běžte se učit jinam!
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Marek Z.
Martin Dráb:

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  -2 30.5.2015 21:06
2 + 2 = 5 for extremely large values of 2
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Martin Dráb
Marek Z.:

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