上記のようにMySQLのバージョンによって異なります。バージョン5.5のMySQLドキュメントに従う:
「アプリケーションが16進数の文字列を返すMD5()やSHA1()などの関数からの値を格納する場合、UNHEX()を使用して16進表現をバイナリに変換し、結果をに格納することで、より効率的な格納と比較を行うことができます。 BINARY(N)列。16進数の各ペアにはバイナリ形式の1バイトが必要なため、Nの値は16進文字列の長さに依存します。NはMD5()値の場合は16、SHA1()値の場合は20です。 。"
したがって、MySQLのバージョンをダウングレードする代わりに、次のようにすることができます。
- 「パスワード」列のタイプをvarchar(32)からbinary(16)に変更します
- 「UNHEX()」MySQL関数をZFコードのMySQLクエリに追加します。例:
$adapter = new Zend_Auth_Adapter_DbTable(
$db,
'user',
'login',
'password',
'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);
私の場合はうまくいきます。
編集-パスワードソルトもバイナリ列に保存されている場合(たとえば、SHA1関数によって生成された16進文字列の場合)、Zend_Auth_Adapter_DbTableの最後のパラメーターは次のようになります:'UNHEX(SHA1(CONCAT(?、LOWER( HEX(salt)))))'したがって、パスワードと連結する前に、saltを小文字の16進文字列に変換し直します。 HEX()はソルトを大文字で返すため、UNHEX()を使用してソルトを保存する前にソルトが元々大文字であった場合は、LOWER()呼び出しを省略できます。