Зависи от версията на MySQL, както е описано по-горе. Следваща MySQL документация за версия 5.5:
„Ако приложение съхранява стойности от функция като MD5() или SHA1(), която връща низ от шестнадесетични цифри, по-ефективно съхранение и сравнения могат да бъдат получени чрез преобразуване на шестнадесетичното представяне в двоично с помощта на UNHEX() и съхраняване на резултата в колона BINARY(N). Всяка двойка шестнадесетични цифри изисква един байт в двоична форма, така че стойността на N зависи от дължината на шестнадесетичния низ. N е 16 за стойност MD5() и 20 за стойност SHA1() ."
Така че, вместо да понижавате версията на MySQL, можете да направите следното:
- променете типа на колоната „password“ от varchar(32) на binary(16)
- добавете функцията 'UNHEX()' MySQL към вашата MySQL заявка в ZF код, например:
$adapter = new Zend_Auth_Adapter_DbTable(
$db,
'user',
'login',
'password',
'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);
В моя случай работи добре.
Редактиране – Ако вашата парола сол също се съхранява в двоична колона (например, ако тя също е шестнадесетичен низ, генериран чрез функцията SHA1), тогава последният параметър на Zend_Auth_Adapter_DbTable трябва да бъде:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))))" И така, ние преобразуваме солта обратно в шестнадесетичен низ с малки букви, преди да се свържем с паролата. HEX() връща вашата сол с главни букви, така че можете просто да пропуснете извикването LOWER(), ако вашата сол първоначално е била главни, преди да сте я съхранили с помощта на UNHEX().