Zadejte hledaný výraz...

Hash sha512 nevěděl by někdo?

Ahoj všichni,
nevěděl byste někdo jak správně vyhashovat heslo pro přístup do administrace ?
Je tam tahle funkce:
Zkouším na to přijít ve zkoušečce:
PHPTESTER - Test PHP code online
Generuji toto, ale heslo to potom nebere...:
Předem dík za rady.
3. 9. 2018 13:43:23
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363881
TomasX
verified
rating uzivatele
(4 hodnocení)
3. 9. 2018 14:38:12
důrazně doporučuji přejít na funkce http://php.net/manual/en/function.password-hash.php, současný stav je naprosto nedostatečný a vysoce nebezpečný. Použití sha512 pro takhle krátký vstup je naopak kontraproduktivní, protože se používají 64 bitová slova a výrazně s tím usnadňuješ práci útočníkovi, to jen tak mimochodem.
Kód vypadá stejně, pohlídal bych velikost písmen v emailu. Obecně není vůbec vhodná dávat email do samotného hesla, best practise je zvolit sůl unikátní pro každé heslo, naštěstí password_hash tohle dělá správně a není potřeba to řešit, projdi si odkázaný manuál a doporučiji přeuložit všechna hesla na nový formát.
3. 9. 2018 14:38:12
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363880
Takže funkci mám přepsat takto:
3. 9. 2018 14:44:11
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363879
Engineer
verified
rating uzivatele
(38 hodnocení)
3. 9. 2018 14:55:11
Děláš to zbytečně složitý, hash z hashe nemá moc smysl, koncová hodnota není závislá na tom, jestli jsou na začátku stejný písmenka, tj. když bude znát e-mail, a bude testovat jednotlivý hesla, bude to pokaždý úplně jinej hash, takže bych to zjednodušil
Nezapomeň ale na to, že jakmile uživatel změní e-mail, musíš přegenerovat hash, proto se taky běžně hashuje jen heslo a ne e-mail.
3. 9. 2018 14:55:11
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363878
TomasX
verified
rating uzivatele
(4 hodnocení)
3. 9. 2018 14:55:20
nedávej tam ten email a rozhodně nedělej hash z již existujícího hashe.
Bcrypt již sám obsahuje sůl a ne opravdu velice nevhodné tam přídávat email, co když ho někdo změní? Mimochodem, není to encryptování, ale hashování, název té funkce je závádějící a nepřesný.
Ještě ale vhodnější postup je nikoliv se upnout na současný algoritmus bcrypt, ale vždy používat ten výchozí i v nových verzích php, tam je potřeba ale již detektovat, jestli není heslo uložena starším algoritmem a případně po úspěšném přihlášení přeuložit hash. Vytaženo z dokumentace.
---------- Příspěvek doplněn 03.09.2018 v 14:56 ----------
Engineer: prosím neraď používat na hesla sha-512 bez soli, už samotný kód, který jsi napsal je z principu špatně a rozhodně by se neměl nikde vyskytovat. Je to nebezpečné si zahrávání s hesly uživatelů a jejich soukromí. Takhle uložená hesla je lahůdka hrubou silou louskat, dnes to zvládnou i notebooky.
3. 9. 2018 14:55:20
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363877
Dal jsem tam toto a nechal jsem si vypsat heslo, ten hash jsem pak uložil do databáze a stejně se nemohu přihlásit....:
3. 9. 2018 15:05:35
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363876
TomasX
verified
rating uzivatele
(4 hodnocení)
3. 9. 2018 15:13:06
děláš asi něco špatně, ale asi vím, kde je chyba. S funkcí password_hash již není možné porovnávat výsledný hash v sql (kvůli spoustě bezpečnostních děr v minulých dobách), ale musíš si z db načíst podle emailu hash a porovnat v php.
Takhle by asi mohla vypadat tvoje funkce login. V tomhle případě nezapomeň do funkce password_hash dávat konstantu PASSWORD_BCRYPT, případě lze použít ten default, ale do login je potřeba ještě přidat update db, pokud se změní algoritmus.
Tohle by již mohlo fungovat:
---------- Příspěvek doplněn 03.09.2018 v 15:15 ----------
nová php funkce password_hash totiž neobsahuje pouze hash, ale i popis algoritmu, sůl a pár dalších drobností, proto nelze přímo porovnávat v sql.
Krom toho poslední dobou se začaly objevovat útoky, které měří čas porovnání samotného hashe a podle toho odvozují heslo, tzv. timing attack, proto již není vůbec vhodné hash porovnávat v sql, pokud na to není uzpůsobené a je potřeba to dělat bezpečně v php.
Password_hash všechny úskalí a problémy řeší za tebe a rozhodně to je jediná správná volba v php.
3. 9. 2018 15:13:06
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363875
Dal jsem to tam takhle a hází mi to chybu: Přikládám pro jistotu celý user
Parse error: syntax error, unexpected '}', expecting ';' in /data/web/virtuals/179602/virtual/www/domains/ulovzakaznika.cz/app/model/User.php on line 24
3. 9. 2018 15:22:57
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363874
Engineer
verified
rating uzivatele
(38 hodnocení)
3. 9. 2018 15:25:13
:TomášX Salt musíš taky někam uložit, pokud se dostane někdo až sem, tak bude mít k dispozici celý kód aplikace i salty. I kdybys je vytvářel dynamicky z nějakých permanentních dat, tak si to dotyčný z kódu PHP zjistí.
:Petr Jasně, že ti to nefunguje, protože když to zavoláš takhle, tak si to pokaždý vygeneruje novej salt, takže konečnej hash je pokaždý jinej, si to zkus:
3. 9. 2018 15:25:13
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363873
TomasX
verified
rating uzivatele
(4 hodnocení)
3. 9. 2018 15:25:43
v tom mém kódu za returny mi chybí ;
Promiň, píšu to jen na mobilu a php nemám v ruce, není to můj primární jazyk
---------- Příspěvek doplněn 03.09.2018 v 15:32 ----------
engineer: jak píšeš sám, password_hash ukládá salt jako součást hashe, není ho potřeba nikam ukládat. Salt nemá smysl pokud je globální, vygenerovat pro něj rainbow table je otázka pár hodin a 100gb dat.
password_hash s bcryptem v současné verzi php je navržený tak, že znalost kódu, saltu a hashe nevede k vyzrazení původního hesla a odolnost proti útoku hrubou silou je vysoká. Parametrem cost jí lze ještě zvednout, mám-li k tomu potřebu.
Doporučovat na ukládání hesel sha-512 je opravdu hodně nebezpečné a nerozvážné.
3. 9. 2018 15:25:43
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363872
Co s tim, aby to bylo stejné ?
3. 9. 2018 15:35:20
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363871
TomasX
verified
rating uzivatele
(4 hodnocení)
3. 9. 2018 15:39:16
nikdy to nebude stejné, to je úmysl. Od toho existuje password_verify, kód který jsem ti tady napsal bude fungovat, jen oprav ty středníky, s tím si snad již poradíš.
Na odkazovaném manuálu to popisují, napravo pak máš odkaz na funkci password verify, také s popisem.
Ten kód jsem bral z dokumentace.
3. 9. 2018 15:39:16
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363870
Vygeneroval jsem noveheslo: Takže mi to vybralo náhodné...
print password_hash('noveheslo', PASSWORD_BCRYPT);
A pak jsem ho vložil do databáze do password....
A nic... nedostanu se tam.
3. 9. 2018 15:47:18
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363869
Engineer
verified
rating uzivatele
(38 hodnocení)
3. 9. 2018 15:47:57
Jj, to je moje chyba, myslel jsem si, že to porovnáváš jako řetězec, blbě jsem si přečetl kód.
Nebudu se tady dál hádat offtopic, jaký má smysl salt v hacknuté DB, to, co jsem uvedl jako funkci nahoře je jednoduchá fce, která ti pokaždý vrátí stejný hash, tj. když jí zavoláš, tak můžeš pak porovnat hash v DB a hash aktuální.
3. 9. 2018 15:47:57
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363868
TomasX
verified
rating uzivatele
(4 hodnocení)
3. 9. 2018 16:10:18
tenhle kód funguje, můžeš si ho přímo vyzkoušet na http://phptester.net
echo "
";
function encrypt_password($email, $password) {
return password_hash($password, PASSWORD_BCRYPT);
}
$email = "admin@ulovzakaznika.cz";
$password = "noveheslo";
$hash_v_db = encrypt_password($email, $password);
echo "heslo v dbn";
var_dump($hash_v_db);
// login
echo "nověření přihlášenín";
var_dump(password_verify($password, $hash_v_db));
vrací to
Co děláš jinak? Jak já je velikost pole pro password v db? Měla by být alespoň 64 znaků. Musíš také upravit tu funkci login, aby nekontrolovala hash v db, ale načetla ho a pak si ho zkontroluješ u sebe. Psal jsem ti tady můj návrh.
Engineer: ta funkce, kterou jsi sem dal je nebezpečná, hrubou silou jí louskne grafika jak nic a pokud dojde k úniku hashů v db, rychle se k tomu dají zjistit hesla, to je ten problém, původní dokonce měla 1000 interakcí, což je o trochu lepší, ale pořád problém. Základní smysl saltu je zvýšit náročnost získání hesla hrubou silou přes předpočítané tzv. rainbow table, zároveň pokud dva lidé mají shodné heslo, nebudou mít shodný hash (ve spojení s emailem je to stejný efekt, ale to zanáší jiné komplikace a problémy). Pokud je salt v db a pro každé heslo jiný, útočník musí hrubou silou louskat všechny kombinace pro každé heslo, nemůže si práci nijak ulehčit (pokud by byl salt pouze jednou v kódu, stačí mu lousknout jedno heslo a zbytek má již snadnější). Password_hash používá bcrypt, což je v současnosti nejpokročilejší algoritmus pro ukládání hesel, interně používá tisíce interakcí při hashování. Zároveň používá normalizovaný tvar hashe, který umožňuje snadno v budoucnu přejít na novější algoritmus a přímo uložit hash. Pro zvýšení odolnosti hesla např. heslo rozmnožuje až na 64 znaků, aby útočník nemohl použít některé optimalizace v závislosti na délce hesla. Nemá smysl vymýšlet vlastní řešení pokud k tomu nemám dostatečné znalosti, tyhle funkce prošly auditem, jsou pod kontrolou, tvoje funkce je plácnutí do vody bez formální a faktické verifikace.
3. 9. 2018 16:10:18
https://webtrh.cz/diskuse/hash-sha512-nevedel-by-nekdo/#reply1363867
Pro odpověď se přihlašte.
Přihlásit