Autor Zpráva
Milan1236000
Profil
Zdravím,
slyšel jsem, že md5 už není bezpečný. Je ale zatím bezpečný sha1?
$hash=SHA1("heslo"."sůl");
$hash=password_hash("heslo", PASSWORD_BCRYPT, ['cost' => 14]);
$hash=password_hash("heslo", PASSWORD_DEFAULT, ['cost' => 14]);
Funkce password_hash() již "solí" a "kostuje" automaticky, že? Mimochodem, proč musí mít sůl víc než 22 znaků (jinak mi to hází chybu)?
Je bezpečnější hash funkce password_hash(), nebo (existuje?) sha512()?
lionel messi
Profil
Milan1236000:
Je ale zatím bezpečný sha1?

Nie, je to len drobné vylepšenie md5.

Funkce password_hash() již "solí" a "kostuje" automaticky, že?

Áno.

Je bezpečnější hash funkce password_hash(), nebo (existuje?) sha512()?

Funkcia sha512 neexistuje.

Dodatok: Existuje funkcia hash umožňujúca použiť algoritumus SHA-512, ale password_hash je jednoznačne lepšou voľbou.
Martin2
Profil *
Použij password_hash bez jakýchkoliv parametrů (v PHP7 už salt ručně zadat nejde, vygeneruje se náhodně)
RastyAmateur
Profil
lionel messi:
Chtěl jsem na to založit téma, ale byl jsem moc líný. Stále to tu čtu - "sha1() není dobrá". Z jakého důvodu?
lionel messi
Profil
RastyAmateur:
Stále to tu čtu - "sha1() není dobrá". Z jakého důvodu?

V podstate z rovnakého, z akého je nevhodná jej pokrvná príbuzná md5 (len tá je na prelomenie /nájdenie kolízneho reťazce/ ešte triviálnejšia).

Vlastnosťou dobrej hashovacej funkcie je náročnosť nájdenia kolízneho reťazca (keďže jej výsledok má bez ohľadu na dĺžku vstupu rovnaký počet bajtov /znakov/, musí niekde existovať kolízia — počet všetkých existujúcich vstupov je oveľa väčší než výstupov). Funkcia MD5 už bola prelomená do takej miery, že príslušný kolízny reťazec k ľubovoľnému hashu možno nájsť v podstate okamžite.

SHA1 bola na tom dosiaľ aspoň z hľadiska praktického úspechu o povestný chlp lepšie (bolo zrejmé, že raz dopadne ako md5, išlo len o otázku času), lenže prvá kolízia bola odhalená už v októbri 2015.

V prvom rade, funkcie SHA1 či MD5 neboli vytvorené s cieľom zabezpečovať heslá. Password_hash navyše heslo aj automaticky osolí (to, že Joker v odkázanom vlákne vysvetľuje princíp soli v kombinácii s md5 si nevšímaj).
RastyAmateur
Profil
lionel messi:
V podstate z rovnakého, z akého je nevhodná jej pokrvná príbuzná md5
md5() jsem nikdy nepoužíval...

V první řadě děkuji za reakci. Moc jsem to nepochopil, ale už částečně vím, o co jde. Solení používám ještě s kombinací ID uživatele (což mi přijde lepší) - bohužel i s funkcí sha1()...
Martin2
Profil *
RastyAmateur:
Solení používám ještě s kombinací ID uživatele (což mi přijde lepší) - bohužel i s funkcí sha1()...
Salt by měl být náhodný. Čím víc náhodný, tím líp. ID uživatele tam vcelku nemá co dělat.

SHA se na zabezpečení hesel nehodí, jak už bylo zmíněno. V podstatě jediný správný způsob je password_hash nebo (ve starších verzích PHP) funkce crypt, pomocí které lze Blowfish hash vygenerovat taky.
Timy
Profil
lionel messi:
Funkcia MD5 už bola prelomená do takej miery, že príslušný kolízny reťazec k ľubovoľnému hashu možno nájsť v podstate okamžite.
To už se s tím posunuli tak daleko? Jaké jsou kolizní řetězce pro tento hash? 90444aa7da7b7f3c5768623ee17b1397
Martin2
Profil *
Timy:
reťazec k ľubovoľnému hashu možno nájsť v podstate okamžite.
Myslím, že se uvádí aktuálně desítky minut na běžném hardwaru. Takže ne okamžitě, ale celkem dost rychle.
Zechy
Profil
A vzhledem k tomu, že běžný BFU si dá heslo typu "12345", tak během chvilky je možné najít řetězec i v rainbow tables.
Martin2
Profil *
Což o to – na kratší vstupy ti najde řetězec pro MD5 hash i Google ;)
RastyAmateur
Profil
Martin2:
Tam jde ale o to, že když 2 uživatelé budou mít stejné heslo, tak to nezjistíš...
Timy
Profil
Martin2:
Myslím, že se uvádí aktuálně desítky minut na běžném hardwaru. Takže ne okamžitě, ale celkem dost rychle.
A kde se to uvádí?
Lonanek
Profil
Proč chcete zjišťovat, zda již někdo stejné heslo používá?
Hesla mohou mít klidně všichni uživatelé stejné, podstatné je přeci jméno (nick, login, ...) uživatele, popřípadě email ale rozhodně ne heslo, navíc pokud je hašované.
RastyAmateur
Profil
Lonanek:
V případě, že se někdo nabourá do databáze, mohlo by to být nebezpečné...
Milan1236000
Profil
Díky všem za reakce. Zarazila mě jedna z nejhlavnějších věcí.
Když uživatel při registraci napíše, jaké chce používat heslo, funkce password_hash() z něho udělá hash (bez jakékoli další úpravy) a ten se uloží do databáze.
Když se chce ale uživatel přihlásit, problém je na světě. Když zadá to samé heslo jako při registraci, tak se z něho vytvoří hash, který se porovná s tím v databázi. Ten problém je v tom, že funkce password_hash() pokaždé ze stejného zadaného řetězce vytvoří jiný hash, takže to se pak uživatel nepřihlásí, ne?
Metody sha1 a md5 pokaždé vytvoří ten samý hash, tam je to jasné.

echo password_hash("heslo", PASSWORD_BCRYPT); //pokaždé vytvoří jiný hash
echo sha1("heslo");
echo md5("heslo");
Fisir
Profil
Reaguji na Milana1236000:
problém je v tom, že funkce password_hash() pokaždé ze stejného zadaného řetězce vytvoří jiný hash, takže to se pak uživatel nepřihlásí
No a proto máme funkci password_verify() ;-)
Milan1236000
Profil
Fisir:
Jasně, díky.
Martin2
Profil *
Timy:
A kde se to uvádí?
Tady. Vyzkoušeno nemám.

Milan1236000:
Ten problém je v tom, že funkce password_hash() pokaždé ze stejného zadaného řetězce vytvoří jiný hash
To je účel, ne? Proto se dává náhodný salt do bezpečnostních hashů.
Když se podíváš na výstup z té funkce, tak obsahuje tři části. Parametry určující typ a nastavení algoritmu, 22 znakový salt a samotný hash.

$2y$10$4sstcsIE7pJT7KHlyTu0VOYlh48VyW1btMjC75BgwcqbUrLMROTXW
Timy
Profil
Martin2:
Tady. Vyzkoušeno nemám.
To by ale dle popisu měl být program, který nalezne dva, v podstatě náhodné, řetězce, které mají stejnou hash. Tj. nefunguje tak, že se mu předhodí hash a on vrátí nějaké řetězce, které mají danou hash.
Milan1236000
Profil
Jen ještě malý dotaz. Do databáze tedy stačí ukládat jen samotný hash? Původní nezahashovaný řetězec není potřeba někam ukládat?
lionel messi
Profil
Milan1236000:
Původní nezahashovaný řetězec není potřeba někam ukládat?

Nielenže netreba, ale bolo by to dokonca maximálne nebezpečné (útočník by mohol získať heslo v surovej podobe veľmi jednoducho).
Milan1236000
Profil
lionel messi:
Ok, díky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: