Autor Zpráva
argonisius
Profil *
Dobrý den, mám v databási zahashované heslo pomocí sha1(). Chtěl bych na stránkách nabídnout možnost odeslání zapomenutého hesla na e-mail. Chtěl bych se zeptat, jestli je nějak možné "dekódovat " zahashované heslo a odeslat ho, nebo jestli to - z bezpečnostních důvodů nejde. Pokud je pravdivá druhá možnost, tak jak se to řeší?
Matty
Profil
argonisius:
Nelze (resp. nijak 100%), od toho je to hash.
Většinou se posílá nějaké nové, vygenerované heslo.
Joker
Profil
argonisius:
nebo jestli to - z bezpečnostních důvodů nejde
Ne "z bezpečnostních důvodů", ono to nejde z principu.
Hash prostě neobsahuje všechny informace o původním vstupu, takže (bez dalších informací) nelze z hashe původní vstup rekonstruovat.

Párkrát už jsem tu zmiňoval příklad: Myslím si sudé číslo. Jaké číslo si myslím?
RockFire
Profil
Joker: 4 :-P
argonisius:
Ověříš, zda je to opravdu ten uživatel a na jeho mail odešleš nové heslo. To vygeneruješ např. fukncí rand().

<?php
$heslo = rand(1, 1000000000);
mail(); //Odeslání mailu s proměnnou $heslo
$heslo_v_hashi = sha1($heslo);
$uprava_v_db = mysql_query(); //A upravení databáze
?>
argonisius
Profil *
Je nutné před uložením do databáze ošetřit pomocí funkce mysqli_real_escape_string i takovýto řetězec - kterýgeneruje script a uživatel na jeho výsledek nemá vliv?
DJ Miky
Profil
Není to nutné, ale pro jistotu je to lepší, nějaká chyba v PHP se může objevit kdykoliv...

Jinak lepší je pro dočasné heslo zřídit nový sloupec v DB a v platnosti nechat i heslo staré - abys zamezil vtipálkům, kteří by takto mohli měnit uživatelům hesla. Dále je dobré nastavit tomu dočasnému heslu určitou platnost - pokud se s ním uživatel nepřihlásí např. do 24 hodin, pak ho smazat (a nechat to staré).
Chamurappi
Profil
Reaguji na argonisia:
Je nutné před uložením do databáze ošetřit pomocí funkce mysqli_real_escape_string i takovýto řetězec
Tahle formulace je divná. Řetězec se escapuje nikoliv kvůli uložení do databáze, ale kvůli sestavení bezpečného a syntakticky korektního SQL dotazu. Do databáze se neukládá escapovaný.
argonisius
Profil *
Aha.. myslel jsem si, že je to nějaké "ošetřění" dat.

takže je to potřeba uvádět vždy?
Majkl578
Profil
RockFire:
Supr, to bych byl nadšený, kdyby mi přišel mail, že mé nové heslo je "1". :)
Raději bych použil nějakou funkci na náhodný řetězec. ;)
Argonisius
Profil
Tak, myslíte si, že by nevadilo použít klíč v databázi, který už byl uložen kvůli aktivaci účtu znovu pro změnu hesla?
Nechce se mi totiž zanášet databázi dalším sloupcem...
AM_
Profil
argonisius:
takže je to potřeba uvádět vždy?
Pokud předem víš, že ukládáš údaj, který nebude obsahovat nějaké speciální znaky (především apostrofy ', mezi které se řetězce uzavírají), tak se to dá vypustit, ale na druhou stranu lepší je uvádět to všude, než jednou to neuvést někde, kde je to potřeba.
Extrémně důležité je to u uživatelských textových vstupů, protože jinak se může stát, že vychytralý uživatel tvůj dotaz nějak naruší
(např. při přihlašování
SELECT id FROM users WHERE username='$uziv' AND password='$sha1_heslo'
si představ, že se někdo přihlásí jako "admin' OR '1".
např. ale u sha1 hashovaného řetězce escapování nutné není, samotné sha1 má na výstupu jen alfanumerické znaky, což vylučuje speciální znaky MySQL samo o sobě

//edit:

Argonisius:
Tak, myslíte si, že by nevadilo použít klíč v databázi, který už byl uložen kvůli aktivaci účtu znovu pro změnu hesla?
to by bylo asi trochu hloupé, představ si, že aktivační e-mail si necháš v poštovním klientu uložený, a nějaký dobrý kamarád, kterého doma pustíš na internet, ti skrz něj změní heslo.
Argonisius
Profil
To mě taky napadlo, ale to mám kvůli tomu vytvářet další sloupce?
AM_
Profil
Argonisius:
To mě taky napadlo, ale to mám kvůli tomu vytvářet další sloupce?
a proč ne? někdo umře, když ho vytvoříš?
Argonisius
Profil
Myslel jsem, že tím zpomalím chod celé hry (větší objem dat) ...

Co k tomu tedy potřebuju?

1) sloupec pro nové heslo
2) sloupec na aktivační odkaz

Ještě něco?
AM_
Profil
Argonisius:

MySQL je dobře optimalizovaná, zpomalení nebude žádné nebo zcela neznatelné.

Možná by stačil sloupec pro aktivační odkaz, aby žadatel o změnu potvrdil svou identitu, a když na něj klikne, nové heslo mu rovnou nacpat do sloupečku pro heslo a poslat mu jej mailem.
Argonisius
Profil
Jako vygenerovat? Jo, to by šlo...

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:

0