Záleží na verzi MySQL, jak je popsáno výše. Následující dokumentace MySQL pro verzi 5.5:
"Pokud aplikace ukládá hodnoty z funkce, jako je MD5() nebo SHA1(), která vrací řetězec hexadecimálních číslic, efektivnějšího ukládání a porovnávání lze dosáhnout převodem hexadecimální reprezentace na binární pomocí UNHEX() a uložením výsledku do sloupec BINARY(N). Každý pár hexadecimálních číslic vyžaduje jeden bajt v binárním tvaru, takže hodnota N závisí na délce hexadecimálního řetězce. N je 16 pro hodnotu MD5() a 20 pro hodnotu SHA1() ."
Takže místo downgradu verze MySQL můžete udělat následující:
- změňte typ sloupce 'heslo' z varchar(32) na binární(16)
- přidejte funkci MySQL 'UNHEX()' do svého dotazu MySQL v kódu ZF, například:
$adapter = new Zend_Auth_Adapter_DbTable(
$db,
'user',
'login',
'password',
'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);
V mém případě to funguje dobře.
Upravit --Pokud je vaše sůl hesla také uložena v binárním sloupci (např. pokud to byl také hexadecimální řetězec generovaný funkcí SHA1), pak by poslední parametr Zend_Auth_Adapter_DbTable měl být:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))'Takže převádíme sůl zpět na malý hexadecimální řetězec před zřetězením s heslem. HEX() vrací vaši sůl velkými písmeny, takže můžete vynechat volání LOWER(), pokud byla vaše sůl původně velká, než jste ji uložili pomocí UNHEX().