2012-07-16 14 views
10

मेरा लक्ष्य ओवरराइड बस प्रत्येक उपयोगकर्ता के लिए Configure::read('Security.salt') उपयोग करने के बजाय प्रत्येक उपयोगकर्ता के लिए एक अनूठा नमक है।CakePHP 2: AuthComponent के "पासवर्ड" विधि

मुझे पता है कि CakePHP 2.x नहीं रह गया है स्वचालित रूप से पासवर्ड हैश। यह मुझे पासवर्ड पर मॉडल सत्यापन करने की अनुमति देता है, जो बहुत अच्छा है। हालांकि, मुझे कोई तरीका नहीं दिख रहा है कि मैं AuthComponent की "पासवर्ड" विधि को ओवरराइड कर सकता हूं। इसलिए मैं डेटाबेस पर सहेजे जाने से पहले पासवर्ड कैसे नियंत्रित कर सकता हूं, इस पर नियंत्रण कर सकता हूं, लेकिन मैं वास्तविक लॉगिन करने के दौरान पासवर्ड को कैसे नियंत्रित कर सकता हूं, इस पर नियंत्रण नहीं कर सकता। रसोई की किताब से:

आप $this->Auth->login() कॉल करने से पहले पासवर्ड हैश करने के लिए जरूरत नहीं है।

$this->Auth->login() पासवर्ड हैशिंग की एक कस्टम विधि का उपयोग करने के लिए मैं क्या कर सकता हूं?

धन्यवाद।

अद्यतन: मैं डॉ हनिबाल लेक्टर के उत्तर (कस्टम प्रमाणीकरण ऑब्जेक्ट बनाने) के साथ जा रहा हूं। यहां इसका तरीका बताया गया है:

पुराने कोड:

$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email'))); 

नए कोड (परिवर्तन "प्रपत्र" के लिए "कस्टम"):

$this->Auth->authenticate = array('Custom' => array('fields' => array('username' => 'email'))); 

बनाएँ "अनुप्रयोग/नियंत्रक/घटक/प्रमाणीकरण/CustomAuthenticate.php "और यह इस तरह दिखने:

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class CustomAuthenticate extends FormAuthenticate { 
} 

कॉपी" _findUser "और" _password lib/केक/नियंत्रक/कॉम "से विधियां" पोनेंट/एथ/बेसएट प्रमाणीकरण.एफ़पी "और उन्हें" कस्टम प्रमाणीकरण "कक्षा में पेस्ट करें। if (empty($result) || empty($result[$model])) {if (empty($result) || empty($result[$model]) || $result[$model][$fields['password']] != $this->_password($password, $result[$model]['id'])) { को

फिर बनाने $model . '.' . $fields['password'] => $this->_password($password),

  • बदलें:

    1. "$ की स्थिति" सरणी से इस लाइन निकालें: फिर "_findUser" विधि के लिए निम्न दो संशोधन करने "_password" विधि के लिए निम्न दो संशोधनों:

      1. बदलकर protected function _password($password) {protected function _password($password, $id) { को

      2. अद्यतन नमक मान बदलकर "$ आईडी" पैरामीटर बनाएं return Security::hash($password, null, true);return Security::hash($password, null, Configure::read('Security.salt') . $id); को

      अन्त में, के रूप में ही तर्क के साथ Security::hash उपयोग करने के लिए AuthComponent::password की सभी घटनाओं को अद्यतन ऊपर।

  • उत्तर

    4

    आप शायद custom auth object बना सकते हैं और फिर भी आपको पासवर्ड हैश है। वे कैसे काम करते हैं इसका सामान्य विचार प्राप्त करने के लिए existing auth objects पर एक नज़र डालें।

    +0

    यह काम करता है! मैंने प्रासंगिक प्रश्न के साथ अपना प्रश्न अपडेट किया। धन्यवाद! – Nick

    1

    आप Auth-> लॉगिन() कॉल का उपयोग नहीं माना बल्कि अपने मॉडल में वर्तमान कार्यान्वयन से कोड का उपयोग है? (Http://api20.cakephp.org/view_source/auth-component#line-506) आप इस पुनर्लेखन आपकी आवश्यकताओं के अनुरूप कर सकते हैं।

    +0

    मुझे यकीन नहीं है कि मैं ऐसा करने के बारे में कैसे जाऊंगा और ऐसा करने के लिए यह बहुत ही डेवलपर-अनुकूल तरीका प्रतीत नहीं होता है। प्रत्येक उपयोगकर्ता के लिए एक अद्वितीय नमक होने का निश्चित रूप से असामान्य लक्ष्य नहीं है। क्या आपके पास कुछ उदाहरण कोड है? किसी भी तरह से, मैं आपके समय की सराहना करता हूं – Nick

    1

    किसी भी व्यक्ति को हैश पासवर्ड (डब्ल्यू/कोड उदाहरण) का सही तरीका क्यों है, इस बारे में अधिक जानकारी चाहते हैं, यहां पर जाएं: http://crackstation.net/hashing-security.htm

    शायद यहां पोस्ट किए गए कोड में थोड़ा सा सुधार है जो मैंने अभी लिखा है, और "नया यादृच्छिक नमक" उत्पन्न करने के लिए सलाह लेना है ... "प्रत्येक बार कोई उपयोगकर्ता खाता बनाता है या अपना पासवर्ड बदलता है । "

    यहां पोस्ट किया गया कार्यान्वयन मूल औथ के हार्ड-कोडित स्थिर नमक के साथ-साथ उपयोगकर्ता आईडी को नमक के रूप में उपयोग करता है जिसका अर्थ है कि जब भी वे अपना पासवर्ड बदलते हैं तो प्रत्येक उपयोगकर्ता के लिए एक ही नमक का पुन: उपयोग किया जाता है। इसलिए यदि आप इस हैशिंग मार्गदर्शिका की सिफारिशों का पालन करना चाहते हैं, तो हर बार जब उपयोगकर्ता अपना पासवर्ड बनाता/बदलता है, तो आपको एक नया यादृच्छिक नमक उत्पन्न करने की आवश्यकता होती है, और उसे उस शेड पासवर्ड के साथ उपयोगकर्ता तालिका में उस अद्वितीय नमक को स्टोर करना होगा।

    आप उनके यादृच्छिक नमक जनरेटर इस्तेमाल कर सकते हैं:

    define("PBKDF2_SALT_BYTES", 24); 
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM)); 
    

    और प्रथा के अनुसार, 'नमक' नामक एक नए क्षेत्र में उन तालिका में संग्रहीत। चूंकि कोड आपको पहले से ही यूजर आईडी देता है, इसलिए आप हमेशा आवश्यक नमक को स्टोर/लुक कर सकते हैं।

    लेख में भी उल्लेख किया गया है कि "कुंजी खींचने" के रूप में जाना जाने वाला तकनीक और पीबीकेडीएफ 2 या बीसीआरपीटी जैसे मानक एल्गोरिदम का उपयोग करके कार्यान्वित करने के लिए "स्लो हैश फ़ंक्शंस" पर एक अनुभाग है। PHP कोड उदाहरण प्रदान किए जाते हैं जिन्हें अतिरिक्त सुरक्षा के लिए आपके कस्टम एथ कार्यान्वयन में कॉपी और चिपकाया जा सकता है।

    CakePHP डेवलपर मार्क स्टोरी पर कैसे करने के लिए implement bcrypt in CakePHP's Auth

    टिप्पणी अनुभाग में, मार्क स्टोरी टिप्पणी की है कि CakePHP 2.3 कुछ नए अंतर्निहित सुविधाओं bcrypt हैश उत्पन्न करने के लिए होगा एक ब्लॉग प्रविष्टि पोस्ट किया गया है।

    0

    केक में कम से कम 2.3 एक अद्वितीय नमक पहले से ही उपयोग किया जाता है, भले ही आपके कॉन्फ़िगरेशन मान में नमक हमेशा समान होता है। मुझे यकीन नहीं है कि यह पुराने संस्करणों के लिए भी सच है।

    आप कॉन्फ़िगर :: लिखने ("सुरक्षा.salt", $ superAwesomeUserSpecificSalt) का उपयोग कर उपयोगकर्ता मॉडल में अपने पहले सेव() फ़ंक्शन में नमक भी बदल सकते हैं;

    संबंधित मुद्दे