Det beror på MySQL-versionen enligt beskrivningen ovan. Följer MySQL-dokumentationen för version 5.5:
"Om en applikation lagrar värden från en funktion som MD5() eller SHA1() som returnerar en sträng med hexadecimala siffror, kan effektivare lagring och jämförelser erhållas genom att konvertera hex-representationen till binär med UNHEX() och lagra resultatet i en BINARY(N) kolumn. Varje par av hexadecimala siffror kräver en byte i binär form, så värdet på N beror på längden på hexsträngen. N är 16 för ett MD5()-värde och 20 för ett SHA1()-värde ."
Så istället för att nedgradera MySQL-versionen kan du göra enligt följande:
- ändra typ av "lösenord"-kolumn från varchar(32) till binär(16)
- lägg till MySQL-funktionen 'UNHEX()' i din MySQL-fråga i ZF-kod, till exempel:
$adapter = new Zend_Auth_Adapter_DbTable(
$db,
'user',
'login',
'password',
'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);
Det fungerar bra i mitt fall.
Redigera --Om ditt lösenordssalt också lagras i en binär kolumn (t.ex. om det också var en hex-sträng som genererades genom SHA1-funktionen) så bör den sista parametern i Zend_Auth_Adapter_DbTable vara:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))'Så, vi konverterar saltet tillbaka till en gemen hex-sträng innan vi sammanfogar med lösenordet. HEX() returnerar ditt salt med versaler så att du bara kan utelämna LOWER()-anropet om ditt salt ursprungligen var versaler innan du lagrade det med UNHEX().