Autor Zpráva
simonek
Profil
jaké doporučujete kódování pro heslo v mysql. dosud jsem ho nekódoval tak bych ocenil nějaké rady.
slyšel jsem o funkci md5() ale nevím jak se používá.
krteczek
Profil
$heslo = md5($heslo)
nebo sha1($heslo) => měla by mít silnější hashovací mechanismus a oproti md5 která má délku 32 znaků má sha1 délku 40 znaků.
Ale myslím si, že je jedno, která se použije
jo a do db se ukládá už jen hash toho hesla, Dej si pozor na vlastnosti sloupce s heslem, pro md5 použij char 32 a pro sha1 char 40
porovnává se tak že vytáhneš poslané heslo protáhneš fcí $heslo = md5($_POST['heslo']); a použiješ v dotazu
Já navíc hashuji i jméno (zvlášt sloupeček v tabulce jako hash_mena) a to samé $jmeno = md5($_POST['jmeno']);
Je to nejrychlejší a nejbezpečnější ošetření proti nedovoleným vstupům, znakům... do db dotazu jdou tudíž jen bezpečné řetězce
Jo a sloupeček s jmeny by měl mít nastaveno unique, aby nemohli být dva stejná přihlašovací jména
Joker
Profil
Relativně silná ochrana hesla je tzv. "salted hash", "solený hash". Vyžaduje ale další sloupec v databázi.
(pro tvorbu hashe lze použít třeba md5 nebo sha1 anebo i nějakou jinou funkci)

Ukládání:
- Řekněme, že zadané heslo mám v $heslo
- Do proměnné třeba $salt vygeneruju řetězec několika (třeba tří) náhodných znaků
- Do databáze uložím hash spojeného řetězce $heslo.$salt a do druhého sloupce hodnotu $salt

Ověření:
- Řekněme, že zadané heslo mám v $heslo
- Z databáze načtu pro daného uživatele "sůl" ($salt) a hash ($hash)
- Zkontroluju, jestli hash spojení $heslo.$salt je stejný jako $hash
- Pokud je shodný, uživatel je vpuštěn

Uživatel tak zadá heslo například "heslo" a do databáze se uloží třeba hash z "heslo8d3" a řetězec 8d3.
Výhody:
- Není na první pohled vidět, že dva lidé mají stejné heslo. Díky tomu, že se u každého přidá jiná "sůl", bude hash různý.
- Hash hesla je daleko těžší prolomit přes tzv "rainbow tables" (databáze hashů pro různé vstupy), protože hashovaný vstup nedává smysluplné slovo (takže není moc pravděpodobné, že v tabulce bude).
- Pro "nabourání" do systému nelze použít jakýkoliv "kolizní řetězec" (tj. řetězec, který dává stejný hash jako heslo)
krteczek
Profil
Joker: záleží jestli nechá tvorbu hesla na uživatelích nebo je generuje? při generovaných heslech (minimálně 6 znaků ze skupiny a-zA-Z0-9) je čarování se saltem zbytečná zátěž databáze (dotazy navíc) //to je jen můj názor
krteczek
tiso
Profil
krteczek žiadny dotaz naviac nepotrebuješ, len sa Ti trošku skomplikuje WHERE...
Joker
Profil
krteczek
To je pravda. Ale obvykle se generované heslo používá leda pro první přístup a pak se uživateli stejně nechá nastavit heslo jeho vlastní, které obvykle bývá primitivní. Alespoň já si jen tak pro zajímavost pustil na jednom diskusním fóru SELECT COUNT(heslo) as pocet FROM uživatelé GROUP BY heslo ORDER BY pocet DESC... a několik těch nejčastějších se dá uhádnout i z hlavy a přitom je používá zhruba mezi 5-10% uživatelů.

Mimochodem, MD5 "heslo" už skoro poznám zpaměti, 955db0b81ef1989b4a4dfeae8061a9a6 :o)))
krteczek
Profil
tiso: proč to dělat jednoduše když to jde složitě:-) ale to WHERE by mne zajímalo ;-)

Joker: nenechávám uživatele aby používali svá hesla, vždycky generuji ;-) uživatelský konfort se stíží jen o tu chvíli kdy to heslo skopíruje z mailu do inputu, potom se většina prohlížečů zeptá jestli si má heslo pamatovat... ;-)

... a několik těch nejčastějších se dá uhádnout i z hlavy...

Jo a potom se diví že mají hacknutý učet.
one_k
Profil
krteczek
WHERE user.heslo = MD5(CONCAT($heslo,user.salt));
krteczek
Profil
one_k: díky,
Toto téma je uzamčeno. Odpověď nelze zaslat.

0