2009-11-16 19 views
5

का उपयोग कर नमक और हश किए गए पासवर्ड को समझना और पुन: उत्पन्न करना मैं कोहाना वी 2.3.4 में ऑथ मॉड्यूल का उपयोग कर रहा हूं।कोहाना: ऑथ मॉड्यूल

प्रमाणीकरण उपयोगकर्ताओं के संदर्भ में, दो चरण की प्रक्रिया है। प्रवेश बिंदु फ़ंक्शन लॉगिन है। यह पहला कार्य डेटाबेस में संग्रहीत पासवर्ड पुनर्प्राप्त करना और पासवर्ड पुनर्प्राप्त करना और नमक मान निर्धारित करना है। नमक माना जाता है कि मूल्यों की एक सरणी द्वारा निर्धारित किया जाता है, प्रत्येक $ नमक में एक बिंदु से संबंधित होता है। $ पासवर्ड नमक के एक और हिस्से को पेश करने के लिए मूल्य धोया जाता है। मेरे मामले में, मैं md5 का उपयोग कर रहा हूँ।

समस्याएं:

  1. मैं इस नमक मूल्य के लिए एक विन्यास नहीं मिल रहा। ऐसा लगता है कि डेटाबेस में संग्रहीत पासवर्ड के भीतर पहले से मौजूद एक पर निर्भर है। क्या ऐसा कोई है या मुझे ऐसा करने के लिए AUTH को कॉन्फ़िगर करने की आवश्यकता है क्योंकि इस लॉगिन को पोर्टेबल और पुन: उत्पन्न करने की आवश्यकता है? यदि यह हैश_पासवर्ड रूटीन में नमक का पता नहीं लगा सकता है, तो यह uniqid() का उपयोग करने के लिए डिफ़ॉल्ट है, जो मुझे विश्वास नहीं है कि पोर्टेबल बिल्कुल है।

  2. उपयोगकर्ताओं को जोड़ने के मामले में, क्या यह सुविधा जोड़ने के लिए ऑथ लाइब्रेरी को संशोधित करना समझ में आता है? यानी, अपना खुद का अनुकूलित एसएएलटी पेश करें जो मैं कह सकता हूं, उस पर एक एमडी 5 हैश करें और फिर एमडी 5 एसएम में दिए गए बिंदुओं पर पासवर्ड को नमक द्वारा उत्पन्न एमडी 5 का उपयोग करें?

  3. मैं कोई सुरक्षा विशेषज्ञ नहीं हूं, लेकिन क्या यह अधिक है? अनुमोदित, यह किसी ऐसे व्यक्ति को रोकता है जो एमडी 5 पासवर्ड सूची तक पूर्व निर्धारित निर्धारित हैश के एमडी 5 लुकअप का उपयोग करने से रोकता है।

  4. यदि आपने कोहाना PHP फ्रेमवर्क का उपयोग किया है, यदि आपके पास इसका उपयोग करने के बाद कोई सबक सीखा या अनुभव है जो इस समस्या के लिए सही दृष्टिकोण के रूप में अंतर्दृष्टि दे सकता है, तो मुझे बताएं। मैं इसके बारे में कई मंच और विकी पढ़ रहा हूं, और अभी तक एक वास्तविक ठोस राय नहीं है जिसे मैंने देखा है। मैं अनिवार्य रूप से इस साइट में किसी को प्रमाणित करने के लिए पुन: उत्पन्न करने की कोशिश कर रहा हूं, दोनों PHP का उपयोग करके और अंत में एक मोबाइल डिवाइस से, जैसे कि आईफोन। मैं अंततः ओपनआईडी समर्थन और एकीकरण के लिए Google मित्र कनेक्ट के लिए समर्थन जोड़ने का भी विचार कर रहा हूं।

नीचे रुचि के कार्यों से संबंधित कोहाना में औथ मॉड्यूल से स्निपेट हैं। उनके पास कुछ डिबगिंग है क्योंकि मैं यह समझने की कोशिश कर रहा हूं कि क्या हो रहा है।


public function login($username, $password, $remember = FALSE) 
{ 
    if (empty($password)) 
     return FALSE; 

    if (is_string($password)) 
    { 
     // Get the salt from the stored password 
     $salt = $this->find_salt($this->driver->password($username)); 
     Kohana::log('debug', "--- Auth_Core login salt = $salt "); 
     Kohana::log('debug', "--- Auth_Core login pass = $password "); 

     // Create a hashed password using the salt from the stored password 
     $password = $this->hash_password($password, $salt); 
    } 
    Kohana::log('debug', "--- Auth_Core login pass_hash = $password "); 
    return $this->driver->login($username, $password, $remember); 
} 
public function find_salt($password) 
{ 
    $salt = ''; 

    foreach ($this->config['salt_pattern'] as $i => $offset) 
    { 
     // Find salt characters, take a good long look... 
     //$salt .= $password[$offset + $i]; 
     $salt .= substr($password, $offset + $i, 0); 
    } 

    return $salt; 
} 
public function hash_password($password, $salt = FALSE) 
{ 
    Kohana::log('debug', "--- Auth_Core Original Pass = $password "); 
    if ($salt === FALSE) 
    { 
     // Create a salt seed, same length as the number of offsets in the pattern 
     $salt = substr($this->hash(uniqid(NULL, TRUE)), 0, count($this->config['salt_pattern'])); 
     Kohana::log('debug', "--- Auth_Core salt created = $salt "); 
    } 

    // Password hash that the salt will be inserted into 
    $hash = $this->hash($salt.$password); 

    // Change salt to an array 
    $salt = str_split($salt, 1); 

    // Returned password 
    $password = ''; 

    // Used to calculate the length of splits 
    $last_offset = 0; 

    foreach ($this->config['salt_pattern'] as $offset) 
    { 
     // Split a new part of the hash off 
     $part = substr($hash, 0, $offset - $last_offset); 

     // Cut the current part out of the hash 
     $hash = substr($hash, $offset - $last_offset); 

     // Add the part to the password, appending the salt character 
     $password .= $part.array_shift($salt); 

     // Set the last offset to the current offset 
     $last_offset = $offset; 
    } 

    Kohana::log('debug', "--- Auth_Core hashpw = $password + $hash "); 

    // Return the password, with the remaining hash appended 
    return $password.$hash; 
} 
+1

'find_salt() 'में, आप जानते हैं कि' substr (..., ..., 0) 'हमेशा खाली स्ट्रिंग वापस कर देगा? – Inshallah

+0

हेहे याह, मैं पहले उस विधि को समायोजित कर रहा था और कल रात को देखा क्योंकि मैं "कोड के बहुत देर हो चुकी" के बिंदु तक पहुंच रहा था। एथ कोड में एक बग दिखाई दिया, हालांकि यदि उपयोगकर्ता नाम डेटाबेस में नहीं मिला था, तो पासवर्ड प्रॉपर्टी मौजूद नहीं होगी। इसके ऊपर टिप्पणी कोड मूल रूप से पढ़ा जाता है। जोड़ा गया कोड मूल रूप से 1 था, लेकिन स्पष्ट रूप से मुझे रात में देर से php doc को गलत तरीके से पढ़ना होगा, यह सोचकर कि यह कई बाइट्स लौटने के बजाय शुरुआती ऑफ़सेट था। धन्यवाद। अच्छी पकड़! – Gary

+0

मुझे ब्राउजर में पासवर्ड और प्रमाणीकरण मिला। बेशक, मैं किस उत्तर को स्वीकार करता हूं? दोनों उत्तरों (लुकमैन और इंशाल्लाह) बहुत उपयोगी थे। एक बार फिर धन्यवाद। – Gary

उत्तर

3

समस्या 1. नमक विन्यास config/auth.php में संग्रहीत किया जाता है। modules/auth/config में उस फ़ाइल को ढूंढें, फिर अपने app/config फ़ोल्डर में (जैसा कि आप पहले से ही जानते हैं, कोहाना कैस्केडिंग फाइल सिस्टम तंत्र का उपयोग करता है)। डिफ़ॉल्ट फ़ाइल है, जो आप app/config/ फ़ोल्डर में अनुकूलित करने के लिए प्रोत्साहित किया जाता है, नीचे की तरह दिखता है:

<?php defined('SYSPATH') OR die('No direct access allowed.'); 

return array 
(
    'driver' => 'ORM', 
    'hash_method' => 'sha1', 
    'salt_pattern' => '1, 3, 5, 9, 14, 15, 20, 21, 28, 30', 
    'lifetime' => 1209600, 
    'session_key' => 'auth_user', 
    'users' => array 
    (
     // 'admin' => 'b3154acf3a344170077d11bdb5fff31532f679a1919e716a02', 
), 
); 

समस्या 2। मेरी राय में, एथ द्वारा उपयोग की जाने वाली पासवर्ड हैशिंग तंत्र, जो नमक सम्मिलन के साथ SHA1 है, काफी सुरक्षित है बशर्ते आप अपने लवण रखें, यानी आपकी auth.php फ़ाइल सुरक्षित रखें।

समस्या 3. प्रमाणीकरण में निर्मित तंत्र hashing SHA1, जो अपेक्षाकृत MD5 की तुलना में अधिक दरार प्रूफ है का उपयोग करता है, तो मैं MD5 तरह से नहीं करते हैं, कोई बात नहीं अपनी योजना कैसे दिखाई दे सकती जटिल कहेंगे। his blog में एक सुरक्षा विशेषज्ञ थॉमस Ptacek लिखा था:

नहीं, वास्तव में। किसी और के पासवर्ड सिस्टम का उपयोग करें। अपना खुद का निर्माण मत करो।

इस उद्योग की सबसे खराब सुरक्षा समस्याओं (मशहूर बुरे LANMAN हैश की तरह) में से अधिकांश इसलिए हुआ क्योंकि स्मार्ट डेवलपर्स सुरक्षा कोड उसी तरह वे उनके कोड के बाकी किया दरवाजा खटखटाया।

समस्या 4. हाँ मैं Kohana उपयोग कर रहा हूँ मेरी छोटी सी कंपनी वेबसाइट और हमारे ग्राहक की वेबसाइट और अब तक मैं प्रमाणीकरण मॉड्यूल के साथ किसी भी समस्या नहीं मिल रहा है में से कुछ का निर्माण करने, हालांकि मैं नहीं कर सकता बहुत कुछ कहें क्योंकि मैंने वास्तव में वास्तविक सुरक्षा-संबंधित वेबसाइट के लिए इसका उपयोग नहीं किया है। लेकिन आम तौर पर, मैं कहूंगा कि कोहना विशेष रूप से कैस्केडिंग फाइल सिस्टम तंत्र के साथ एक उत्कृष्ट ढांचा है।

+0

आपकी समस्या 3 प्रतिक्रिया के संबंध में, मैं सोच रहा हूं कि कोहाना अपनी खुद की विधि बना रहा है। एक ऑथ पीईआर मॉड्यूल है जो प्रमाणीकरण के मुद्दों के आसपास डिज़ाइन किया गया प्रतीत होता है, जो मुझे विश्वास दिलाता है कि शायद मुझे इसका उपयोग करना चाहिए क्योंकि उसके पास शायद उनकी विधि की तुलना में अधिक आंखें और दृश्यता हो। – Gary

3

के बारे में बात 1, hash_password() समारोह पासवर्ड हैश (नमक और नमक सहित के खिलाफ) उत्पन्न करने के लिए दोनों का उपयोग किया जाता है कि डेटाबेस में संग्रहीत किया जाता है (कम से जैसे साइनअप समय), साथ ही उस हैश को फिर से बनाने के लिए जब पासवर्ड को सत्यापित करने की आवश्यकता होती है (उदाहरण के लिए लॉगिन-समय पर)।hash_password() फ़ंक्शन पासवर्ड-हैश में दिए गए किसी भी नमक को एन्कोड करेगा (या uniqid() यदि कोई नहीं दिया गया है); यह एन्क्रिप्शन का एक रूप है जहां salt_pattern कुंजी है; यदि salt_pattern को गुप्त रखा जा सकता है, तो यह अतिरिक्त सुरक्षा प्रदान करता है क्योंकि एक विज्ञापन हैश की ऑफ़लाइन ब्रूट-फोर्सिंग करने में सक्षम नहीं होगा क्योंकि हैशिंग की विधि पुन: उत्पन्न नहीं होती है (यदिsalt_pattern गुप्त रखा जा सकता है):

// Signup time; forget about uniqid(); you can use any salt that 
// you please; once the password hash is stored in the database there 
// is no need to know where your salt came from since it will be 
// included in the password hash. 
$password_hash = hash_password($password, FALSE); 

// Login time; note that the salt is taken from the password hash itself. 
$reproduced = hash_password($password, find_salt($password_hash)); 
$verifies = $password_hash == $reproduced; 

hash_password() समारोह पहले नमक के खिलाफ पासवर्ड हैश, और फिर इसी salt_pattern ऑफसेट पर पासवर्ड हैश में नमक से प्रत्येक चार डालें। find_salt() इन नमक वर्णों को निकालेगा ताकि हैश को पुन: उत्पन्न किया जा सके। आप इसे hash_password() नमक एन्क्रिप्ट करने और find_salt() को डिक्रिप्ट करने के रूप में देख सकते हैं। यद्यपि आप यह भी देख सकते हैं कि hash_password() नमक को छिपा रहा है और find_salt() इसे ढूंढ रहा है, एन्क्रिप्शन की इस विधि को steganography नहीं कहा जा सकता है, क्योंकि मुझे लगता है कि यह कोड से स्पष्ट है कि पासवर्ड हैश के साथ एक नमक है (अस्तित्व नमक का रहस्य गुप्त नहीं है)।

अपने स्वयं के नमक का उपयोग करके बिंदु 2 के संबंध में, सरल मॉड्यूल और पहले से मौजूद डेटाबेस के साथ पूरी तरह से संगत है।

बिंदु 3 के बारे में, एक प्रति उपयोगकर्ता नमक (uniqid() डिफ़ॉल्ट रूप से) का उपयोग कर नहीं overkill है। विशेष रूप से एमडी 5 जो सुरक्षा उद्देश्यों के लिए टूटा हुआ है और जहां टकराव ढूंढना आज की तकनीक के साथ पहले से ही व्यावहारिक है। bcrypt() का उपयोग करना बेहतर होगा जो ब्रूट-फोर्सिंग प्रयासों को विफल करने के लिए एक उद्देश्य से धीमी हैशिंग एल्गोरिदम का उपयोग करता है।

बिंदु 4 के संबंध में, मैंने पहले कोहाना फ्रेमवर्क का उपयोग नहीं किया है, लेकिन ऑथ मॉड्यूल को पुन: उत्पन्न या पोर्ट करना सरल है। देखभाल की जानी चाहिए कि salt_pattern भूल या खोया नहीं गया है क्योंकि यह हैशिंग एल्गोरिदम का एक अनिवार्य हिस्सा है। salt_pattern को भी गुप्त रखा जाना चाहिए क्योंकि यह एकमात्र चीज है जो निर्धारित पासवर्ड हैश को ब्रूट करने के लिए विरोधी से रखती है। uniqid() सिर्फ एक उचित डिफ़ॉल्ट है और आप जो कुछ भी चाहते हैं के साथ बदला जा सकता है (जब तक यह प्रति-उपयोगकर्ता और नहीं एक निरंतर साइट-व्यापी मूल्य है।)


इसके अलावा, यहाँ पर एक बहुत अच्छा जवाब है portable bcrypt() and PHP के बारे में stackoverflow। स्वाभाविक रूप से एथ मॉड्यूल के साथ संगत नहीं होगा, लेकिन मैं इसे किसी भी तरह से उल्लेख करना चाहता हूं क्योंकि धीमी हैश का उपयोग करने के लिए यह सबसे अच्छा अभ्यास है और salt_patten जैसे रखने वाले रहस्यों पर भरोसा नहीं करना है।

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