जैसा कि ऊपर वर्णित है यह MySQL संस्करण पर निर्भर करता है। संस्करण 5.5 के लिए MySQL दस्तावेज़ों का अनुसरण:
"यदि कोई एप्लिकेशन MD5 () या SHA1 () जैसे फ़ंक्शन से मूल्यों को संग्रहीत करता है जो हेक्स अंकों की एक स्ट्रिंग देता है, तो अधिक कुशल भंडारण और तुलना UNHEX () का उपयोग करके हेक्स प्रतिनिधित्व को बाइनरी में परिवर्तित करके और परिणाम को संग्रहीत करके प्राप्त की जा सकती है। एक बाइनरी (एन) कॉलम। हेक्स अंकों की प्रत्येक जोड़ी को बाइनरी रूप में एक बाइट की आवश्यकता होती है, इसलिए एन का मान हेक्स स्ट्रिंग की लंबाई पर निर्भर करता है। एन एमडी 5 () मान के लिए 16 और SHA1 () मान के लिए 20 है ।"
तो, MySQL संस्करण को डाउनग्रेड करने के बजाय, आप निम्न प्रकार से कर सकते हैं:
- 'पासवर्ड' कॉलम के प्रकार को varchar(32) से बाइनरी(16) में बदलें
- ZF कोड में अपनी MySQL क्वेरी में 'UNHEX ()' MySQL फ़ंक्शन जोड़ें, उदाहरण के लिए:
$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() का उपयोग करके संग्रहीत करने से पहले अपरकेस था।