2012-04-23 19 views
11

मैं वर्तमान में लॉगिन सिस्टम लागू कर रहा हूं। मैं डेटाबेस में पासवर्ड और नमक स्टोर करना चाहता हूं। अब मुझे पता चला है कि hash() और crypt() फ़ंक्शन ऐसा लगता है (SHA512 के लिए मान्य)।हैश() बनाम क्रिप्ट() फ़ंक्शन तुलना

hash() नया है और crypt() से अधिक हैशिंग एल्ग्रिथम का समर्थन करता है। या क्या कोई अन्य अंतर मुझे पता होना चाहिए/परवाह करना चाहिए?

संपादित करें:

function generatePasswordHash($password){ 
    $salt = base64_encode(mcrypt_create_iv(8)); 
    $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

    return $calculatedPasswordHash; 
} 

परिणाम लग रहा है $1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.

यहाँ अपना पासवर्ड चेकिंग समारोह की तरह:

function checkLoginData($username, $password){ 
    global $db; 

    $sql = "SELECT * FROM users WHERE username = :username"; 
    $result = $db->ExecuteQuery($sql, array("username"=>$username)); 

    if(!empty($result)){ 
     $result = $result[0]; 
     $savedPasswordHash = $result['password']; 
     $splitted = explode("$", $savedPasswordHash); 
     $salt = $splitted[2]; 
     $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

     if($savedPasswordHash === $calculatedPasswordHash){ 
      return true; 
     } 
    } 

    return false; 
} 
+0

@CodeInChaos: डेटाबेस से पासवर्ड हैश संग्रह और एक्सेस करना। दोनों नमक ले सकते हैं (concatenation के माध्यम से 'हैश()' के '$ डेटा' पैरामीटर में नमक जोड़ें)। – testing

+1

बस कई मामलों में डेटा के लिए नमक को जोड़ना असुरक्षित है। ऐसा मत करो, जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं। यह भी * तेज़ * है और आप इसे * धीमा * होना चाहते हैं। – CodesInChaos

+1

नया कोड पासवर्ड को एन्क्रिप्ट करने के बजाय पासवर्ड को एन्क्रिप्ट करता है। यानी यह मामूली रूप से उलटा हो सकता है। – CodesInChaos

उत्तर

15

उपयोग hash हैशिंग के लिए, अखंडता की जाँच में उदाहरण के लिए। यह सीधे निर्दिष्ट हैशिंग एल्गोरिदम का उपयोग करता है।

crypt एक विशेष उद्देश्य समारोह है। इसका उपयोग पासवर्ड हैशिंग और कुंजी व्युत्पन्न के लिए किया जाता है। आपको नमक में गुजरना होगा, जो अप्रत्यक्ष रूप से उपयोग की जाने वाली हैशिंग योजना का निर्धारण करता है। भले ही आप CRYPT_SHA512 चुनते हैं, यह सादा SHA512 नहीं है। यह एक प्रमुख व्युत्पन्न कार्य है जो बिल्डिंग ब्लॉक के रूप में SHA512 का उपयोग करता है। विशेष रूप से ऐसी योजना जानबूझकर धीमी होती है (हाइडर ब्रूट-फोर्स अटैक) और सुरक्षित तरीके से नमक और पासवर्ड को जोड़ती है।

लॉग सिस्टम में पासवर्ड हैशिंग के लिए, crypt स्पष्ट रूप से सही विकल्प है।

+0

पासवर्ड हैश को संग्रहीत/पुनर्प्राप्त करने के लिए आप किस फ़ंक्शन का उपयोग करना पसंद करते हैं? 'CRYPT_BLOWFISH' के साथ – testing

+2

'क्रिप्ट' और क्रिप्टो पीआरएनजी से उच्च गुणवत्ता वाले नमक, जैसे 'mcrypt_create_iv' ठीक होना चाहिए। इसके लिए PHP 5.3 की आवश्यकता है। लेकिन जैसा कि मैं कोई PHP प्रोग्रामर नहीं हूं, मैंने विवरणों में ध्यान नहीं दिया है। – CodesInChaos

+0

मुझे पता चला कि वेबस्पेस केवल 'मानक डीईएस' और 'एमडी 5' प्रदान करता है। मुझे 'mcrypt' लाइब्रेरी में एक नज़र डालेंगे ... – testing