Autor Zpráva
Pavlii
Profil *
Zdravím vás přátelé,

narazil jsem na problém s hashováním skrze MD5:

1) číslo z uživatelského formuláře ukládám do MySQL jako číslo a zárověn
2) jej přes md5(číslo) kóduju do stringu pro odeslání uživateli

Problém je, že když pak vytáhnu z MySQL to číslo a zahashuju ho opět MD5, výsledný hash je rozdílný od toho, který jsem poslal uživateli. Bádáním jsem také zjistil, že když změním typ v MySQL tabulce na TEXT, INT, VARCHAR... výsledný string se mění. Naopak když přímo do funkce MD5 zapíšu dané číslo, výsledný string je roven tomu, které jsem uživateli poslal. Můj dotaz tedy zní:

Jak zajistit, aby se číslo z DB správně zahashovalo?

Děkuji všem za pomoc, radu :-)
Pepiik
Profil
hash je jednosměrné zašifrování a nelze jej zpětně algoritmem rozšifrovat.
pokud chceš porovnávat hesla tak zaheshuj ten druhej text z formuláře a porovnávej oba dva hashe.


jakýkoliv text na vstupu MD5 vrací 32znaků čili v databázi nastav varchar(32).


$hash_v_db = .... ; // zde je hash ktery je v db
$hash_form =  md5($_POST['heslo']);


if($hash_v_db==$hash_form){
 echo "hesla se shodují";
}else{
 echo "spatne heslo"
}
Medvídek
Profil
Pepiik:
akýkoliv text na vstupu MD5 vrací 32znaků čili v databázi nastav varchar(32).
Tak to už je lepší použít CHAR(32)
Pepiik
Profil
Medvídek:
Jo máš pravdu :) případně lze ještě binary(16)
Joker
Profil
Pepiik:
hash je jednosměrné zašifrování a nelze jej zpětně algoritmem rozšifrovat.
Takže to v první řadě vůbec není šifrování.

Pavlii:
Problém je, že když pak vytáhnu z MySQL to číslo a zahashuju ho opět MD5, výsledný hash je rozdílný od toho, který jsem poslal uživateli.
Tak to není přesně ten stejný řetězec.

Jinak nechápu smysl té popsané činnosti: Vytvořit číslo, jeho hash poslat uživateli, to číslo si uložit a při kontrole z něj udělat hash a porovnávat ty hashe.
Pavlii
Profil *
Joker:
Myslím, že je v tuto chvíli bez důvodné popisovat důvod této činnosti. Podstatou je, že to nefunguje.

Číslo, které jsem zapsal do DB a někdy později ho vytáhnu je třeba 8388607. To jsem zapsal do DB ale zároveŇ zahashoval.

$puvodni_hash = "32433904a755e2b9eb82cf167723b34f";
//již jsem zahashoval při zápisu čísla do DB, ale v DB je jen to číslo, nikoli hash. Hash potřebuji jen jednorázově.


$dotaz = mysql_query(select cislo from tabulka .....);
$row = mysql_fetch_array($dotaz);

if ($puvodni_hash == md5($row[cislo]))
{
echo "Bomba, skvělé, funguje to a já jsem spokojenej";
}
else
{
echo "Je to v řiti a já taky!";
}
Pepiik
Profil
Pavlii:
To co máš v databázi zahešované už znova hešovat nebudeš ..

v databázi by jsi měl mít uložený právě ten hash 32433904a755e2b9eb82cf167723b34f

.. pak v tom formuláři uživatel zadá 8388607 a to ty zahešješ a porovnáš s tím hashem v databázi.

md5(8388607) == "32433904a755e2b9eb82cf167723b34f"
Joker
Profil
Pavlii:
Myslím, že je v tuto chvíli bez důvodné popisovat důvod této činnosti.
Mě spíš zarazilo, že ta činnost je nesmyslná.
Takhle se hash normálně nepoužívá a je to nelogické; Kdyby se použilo rovnou to číslo, výsledek bude stejný a ušetří se práce.

Ale když už to z nějakého podivného důvodu má být takhle, udělal bych MD5 rovnou v databázi: SELECT MD5(cislo) FROM tabulka.
Pokud to i přesto vyjde jinak, není v databázi uložené to co by tam mělo být.
Můžete načíst hodnotu sloupce a udělat var_dump, jestli tam je skutečně to co má být.

Další chyby, které v tom skriptu jsou:
- $row[cislo] - řetězec není v uvozovkách.
- mysql_* funkce jsou zastaralé a neměly by se pro nové projekty používat.
- Pro uvedené porovnání by byl lepší operátor === než ==.

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: