2010-09-16 4 views
8

हैश विधि और नमक सेट करने के लिए setCredentialTreatment के साथ Zend_Auth का उपयोग कर रहा हूं। मैं इस तरह कुछ ऐसा करने वाले सभी उदाहरण देखता हूं, जहां salt टेक्स्ट के रूप में डाला जाता है।Zend_Auth setCredentialTreatment

-।> SetCredentialTreatment ('? SHA1 (concat (नमक))'

लेकिन मेरे नमक डेटाबेस में संग्रहीत किया जाता है मैं इसे पहले तो पुनः प्राप्त कर सकता है setCredentialTreatment में इसका इस्तेमाल करते हैं, लेकिन वहाँ एक है जिस तरह से मैं एक क्षेत्र नाम के रूप में इसे सीधे निर्धारित कर सकते हैं, तो setCredentialTreatment कि क्षेत्र से इसे पाने के लिए पता होगा? एक तरह से जिस तरह से जैसे हम फ़ील्ड नाम उपयोगकर्ता नाम या पासवर्ड

->setCredentialColumn('password') 

एक ओर मुद्दा मैं कर रहा हूँ के लिए परिभाषित यह है कि मैं SHA512 का उपयोग करना चाहता हूं SHA1 नहीं। क्या यह संभव है या यह उपलब्ध नहीं है? SHA1 का उपयोग करके देखे जाने वाले सभी उदाहरण।

मुझे कहना चाहिए कि मैं ज़ेंड करने के लिए काफी नया हूं और मौजूदा एप्लिकेशन को पोर्ट कर रहा हूं, इसलिए कृपया उत्तर के साथ मेरे लिए आसान हो जाएं।

उत्तर

8

आपके द्वारा दिया गया उदाहरण डेटाबेस में संग्रहीत नमक का उपयोग करता है। यह तब तक काम करेगा जब तक नमक को 'नमक' नामक क्षेत्र में प्रत्येक पंक्ति में रखा जाता है।

->setCredentialTreatment("SHA1(CONCAT(?, '$salt'))") 

SHA512 का उपयोग कर के रूप में, यह एक छोटे से जटिल काम हो सकता है: यदि नमक डीबी में और बदले में एक PHP चर में नहीं था, कोड और अधिक की तरह कुछ होगा। मान लें कि आप इस मामले में MySQL, SHA1() का उपयोग कर रहे हैं, एक MySQL फ़ंक्शन है, और MySQL के पास SHA512 के लिए कोई फ़ंक्शन नहीं है, जहां तक ​​मैं कह सकता हूं, और न ही PHP करता है (संपादित करें: मैं बाद वाले के बारे में गलत था, टिप्पणियां देखें)। तो आपको अपने स्वयं के PHP SHA512 फ़ंक्शन को कार्यान्वित करना होगा, उपयोगकर्ता को डीबी से पहले नमक लोड करना होगा, परिणाम हैश सेट करें और सेट क्रेडेंशियल ट्रीटमेंट में चर के लिए कुछ भी नहीं करें।

जैसा कि अन्य उत्तर सुझाव दिया गया है कि आप इसके लिए अपना स्वयं का Zend_Auth_Adapter लिखना चाहेंगे। एक ऑथ एडाप्टर एक वर्ग है जो प्रमाणीकरण को संभालता है, संभवतः उस समय जब आप Zend_Auth_Adapter_DbTable का उपयोग कर रहे हैं। आप मैन्युअल में अधिकार का एडेप्टर के बारे में कुछ और जानकारी मिल सकती: http://framework.zend.com/manual/en/zend.auth.introduction.html

यहाँ एक उदाहरण है:

class My_Auth_Adapter extends Zend_Auth_Adapter_DbTable 
{ 
    public function authenticate() 
    { 
     // load salt for the given identity 
     $salt = $this->_zendDb->fetchOne("SELECT salt FROM {$this->_tableName} WHERE {$this->_identityColumn} = ?", $this->_identity); 
     if (!$salt) { 
      // return 'identity not found' error 
      return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identity); 
     } 

     // create the hash using the password and salt 
     $hash = ''; // SET THE PASSWORD HASH HERE USING $this->_credential and $salt 

     // replace credential with new hash 
     $this->_credential = $hash; 

     // Zend_Auth_Adapter_DbTable can do the rest now 
     return parent::authenticate(); 
    } 
} 
+0

पीएचपी हैश विस्तार के माध्यम से SHA512 समर्थन हासिल है: हैश ('SHA512', 'हैश करने के लिए कुछ पाठ') ; –

+0

असल में मूल PHP में मैं 'हैश_हैमैक ('sha512') का उपयोग करता हूं, लेकिन इसके लिए एक नए एडाप्टर को ओवरकिल परिभाषित नहीं कर रहा है। कोड के कितने लाइन नए एडाप्टर को परिभाषित करेंगे? मैं लिंक किए गए पेज से नहीं बता सका क्योंकि वे कोड को छोटा कर रहे हैं। – jblue

+0

PHP में हैशिंग करने के लिए पहले नमक को लोड करने की दो-चरणीय प्रक्रिया है जो आपकी आवश्यकता को थोड़ा सा कस्टम बनाती है। आप Zend_Auth_Adapter_DbTable का विस्तार कर सकते हैं ताकि अधिक कोड की आवश्यकता न हो। मैंने अपना उत्तर शुरू करने के लिए एक उदाहरण के साथ संपादित किया है - कोड पूरी तरह से अनचाहे है। $ हैश = '' बदलें; अपने hash_hmac() कोड के साथ भाग लें। –

2

आप अपना खुद का Zend_Auth_Adapter लिख सकते हैं।