To zależy od wersji MySQL, jak opisano powyżej. Postępując zgodnie z dokumentacją MySQL dla wersji 5.5:
„Jeśli aplikacja przechowuje wartości z funkcji, takiej jak MD5() lub SHA1(), która zwraca ciąg cyfr szesnastkowych, bardziej wydajne przechowywanie i porównania można uzyskać, konwertując reprezentację szesnastkową na binarną za pomocą UNHEX() i przechowując wynik w kolumna BINARY(N). Każda para cyfr szesnastkowych wymaga jednego bajtu w postaci binarnej, więc wartość N zależy od długości ciągu szesnastkowego. N to 16 dla wartości MD5() i 20 dla wartości SHA1() ”.
Tak więc, zamiast obniżać wersję MySQL, możesz wykonać następujące czynności:
- zmień typ kolumny „hasło” z varchar(32) na binarny(16)
- dodaj funkcję MySQL „UNHEX()” do zapytania MySQL w kodzie ZF, na przykład:
$adapter = new Zend_Auth_Adapter_DbTable(
$db,
'user',
'login',
'password',
'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);
W moim przypadku to działa dobrze.
Edytuj --Jeśli sól hasła jest również przechowywana w kolumnie binarnej (np. jeśli był to ciąg szesnastkowy wygenerowany przez funkcję SHA1), to ostatnim parametrem Zend_Auth_Adapter_DbTable powinien być:'UNHEX(SHA1(CONCAT(?, LOWER() HEX(salt))))) „Zatem konwertujemy sól z powrotem na ciąg szesnastkowy składający się z małych liter przed połączeniem z hasłem. HEX() zwraca sól w postaci wielkich liter, więc możesz po prostu pominąć wywołanie LOWER(), jeśli twoja sól była pierwotnie pisana wielkimi literami przed zapisaniem jej za pomocą UNHEX().