2013-10-29 7 views
10

का उपयोग करके एन्क्रिप्टेड होने के बाद मेल नहीं खाता है, मैंने अपनी पुरानी पोस्ट को संशोधित किया है। मैंने क्रिप्ट() फ़ंक्शन का प्रयास किया और अब डेटाबेस से आने वाले एन्क्रिप्टेड पासवर्ड को सत्यापित करने के लिए password_hash() और password_verify() के साथ काम करने का प्रयास कर रहा है लेकिन प्रत्येक कॉल पर, password_hash() फ़ंक्शन एक अलग एन्क्रिप्टेड स्ट्रिंग को रोकता है और password_verify() इसे मेल नहीं कर सकता है।पासवर्ड क्रिप्ट() और password_hash() फ़ंक्शन

इस तरह मैं यह कर रहा हूं।

//please ignore the syntax error if any 

$data = '11'; 
$dbpass = password_hash($data, PASSWORD_BCRYPT); 
echo $dbpass; // displays the random strings on each page refresh. 

डेटाबेस में पासवर्ड सहेजा जाने के बाद लॉगिन प्रक्रिया के दौरान मेल नहीं मिलता है। नीचे मेरा वास्तविक कार्य है।

private function process_data($password){ 
    $password = __STR.$password.__STR; 
    return password_hash($password, PASSWORD_BCRYPT); 

    } 
    private function processed($login_password, $dbpassword){ 
    $login_password = __STR.$login_password.__STR; 
    return password_verify($login_password, $dbpassword); 
    } 

पासवर्ड के लिए हैश स्ट्रिंग बनाने के लिए प्रत्येक फ़ंक्शन कॉल पर, फ़ंक्शन अगली बार अलग स्ट्रिंग देता है।

+0

कृपया पढ़ें कि आपको हैश पासवर्ड में एमडी 5 का उपयोग क्यों नहीं करना चाहिए: http://www.php.net/manual/en/faq.passwords.php – Tchoupi

+0

मुझे विश्वास है (और कई स्थानों पर पढ़ा है) यह बेहतर अभ्यास है प्रत्येक पासवर्ड को अपना नमक देने के लिए। – Ethan

+0

आपके साथ सहमत हुए। मैंने देखा है कि एमडी 5 एन्क्रिप्शन के विपरीत इंटरनेट पर आसानी से उपलब्ध है। लेकिन मैंने हैकर को यह पता लगाने में कठिनाई करने के लिए इसमें नमक जोड़ने की कोशिश की कि यह पासवर्ड क्या है। क्या यह एक अच्छा विचार नहीं है? मैं हमेशा एक विशेषज्ञ राय की तलाश करता हूं। –

उत्तर

44

ठीक है, चलिए इसे एक-एक करके देखते हैं।

सबसे पहले, यह hashing है, है ना एन्क्रिप्शन। एन्क्रिप्शन दो तरह से है, हैशिंग एक रास्ता है। हम हैश करना चाहते हैं। हम कभी एन्क्रिप्ट नहीं करना चाहते हैं। हां, शब्दावली मायने रखती है। कृपया सही शब्दावली का प्रयोग करें।

अगला, प्रत्येक कॉल password_hash को एक अलग हैश वापस करने के लिए माना जाता है। ऐसा इसलिए है क्योंकि यह एक मजबूत यादृच्छिक नमक पैदा कर रहा है। इस तरह यह डिजाइन किया गया था, और आप वास्तव में इसका उपयोग कैसे करना चाहिए।

आगे, पासवर्ड से पहले और बाद में __STR जोड़ने की "मिर्च" चीज़ करें। आप कुछ भी नहीं कर रहे हैं लेकिन उपयोगकर्ता पासवर्ड को कमजोर कर रहे हैं (जो अच्छा नहीं है)। यदि आप इस बारे में अधिक जानकारी चाहते हैं कि यह एक बुरा विचार क्यों है: Read This Answer

निरंतर, मैं अत्यधिक अनुशंसा करता हूं कि आप सीधे crypt का उपयोग न करें। यह वास्तव में आश्चर्यजनक रूप से आसान है और बेहद कमजोर हैश उत्पन्न करता है। यही कारण है कि password_* एपीआई डिजाइन किया गया था। crypt एक निम्न स्तर की लाइब्रेरी है, आप अपने कोड में उच्च स्तर की लाइब्रेरी का उपयोग करना चाहते हैं। Bcrypt को पेंच करने के तरीकों के बारे में अधिक जानकारी के लिए, मेरा ब्लॉग देखें: Seven Ways To Screw Up Bcrypt

पासवर्ड एपीआई को एक साधारण, एक-स्टॉप शॉप के रूप में डिजाइन किया गया था। यदि यह आपके लिए काम नहीं कर रहा है तो निम्न चीज़ें जांचें:

  1. क्या आप PHP> = 5.5.0 का उपयोग कर रहे हैं? या आप password_compat के साथ PHP> = 5.3.7 का उपयोग कर रहे हैं?

    1. क्या आपका डेटाबेस कॉलम पर्याप्त है?

      यह कम से कम 60 वर्णों की आवश्यकता है।

    2. क्या आप जांच रहे हैं कि फ़ंक्शन का परिणाम एक स्ट्रिंग है, और bool(false) नहीं है?

      यदि कोई आंतरिक त्रुटि है, तो यह password_hash से एक गैर-स्ट्रिंग वापस कर देगा।

    3. क्या आपको कोई त्रुटि मिल रही है?

      क्या आपने अपनी अधिकतम सेटिंग में error_reporting चालू किया है (मैं सब कुछ पकड़ने के लिए -1 की अनुशंसा करता हूं) और जांच की है कि कोड कोई त्रुटि नहीं फेंक रहा है?

    4. क्या आप वाकई इसे सही तरीके से उपयोग कर रहे हैं?

      function saveUser($username, $password) { 
          $hash = password_hash($password, PASSWORD_BCRYPT); 
          // save $username and $hash to db 
      } 
      function login($username, $password) { 
          // fetch $hash from db 
          return password_verify($password, $hash); 
      } 
      

      ध्यान दें कि प्रत्येक को केवल एक बार बुलाया जाना चाहिए।

  2. आप password_compat साथ पीएचपी < 5.3.7 का उपयोग कर रहे हैं? यदि हां, तो यह आपकी समस्या है। आप PHP के असमर्थित संस्करण पर संगतता लाइब्रेरी का उपयोग कर रहे हैं। आप इसे काम पर ला सकते हैं (कुछ रेडहाट वितरणों ने आवश्यक सुधारों का समर्थन किया है), लेकिन आप असमर्थित संस्करण का उपयोग कर रहे हैं। कृपया एक उचित रिलीज में अपग्रेड करें।

सब और विफल रहता है, इस कोड चल रहा है और उत्पादन पुन: रिपोर्ट करने का प्रयास करें:,

$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG'; 
$test = crypt("password", $hash); 
$pass = $test == $hash; 

echo "Test for functionality of compat library: " . ($pass ? "Pass" : "Fail"); 
echo "\n"; 

कि देता है, तो Fail आप PHP के एक असमर्थित संस्करण चला रहे हैं और नवीनीकृत करना चाहिए। यदि यह पास लौटाता है, तो त्रुटि आपके तर्क में कहीं है (लाइब्रेरी ठीक काम कर रही है)।

+0

आपको बहुत धन्यवाद @ircmaxell। मैंने आपके saveUser और लॉगिन फ़ंक्शन की कोशिश की है और यह काम करता है। अब मैं अपनी वेबसाइट पर इन कोशिश करने जा रहा हूं और यह अंतिम परीक्षण होगा। मुझे नहीं पता कि यह पहले क्यों काम नहीं करता था। मैंने पासवर्ड_शैश और पासवर्ड_वर्क्स कार्यों का प्रयास किया और मुझे उनका उपयोग करने से पहले नौकरी नहीं मिल सका। उम्मीद है कि ये मेरी वेबसाइट में काम नहीं करेंगे। मुझे परीक्षण करने दो और मैं आप पर वापस आऊंगा। धन्यवाद –

+1

यह आदमी काम किया। मैंने उस कार्यक्षमता की कोशिश की जिसे आपने 4 बिंदु में समझाया था। भगवान आपको आशीर्वाद देते हैं। चीयर्स !! –

+1

@ हुनजाएली: इसे सुनकर खुशी हुई! – ircmaxell

1

पासवर्ड स्टोर करने का सबसे अच्छा तरीका PHP के फ़ंक्शन password_hash() का उपयोग करना है। यह स्वचालित रूप से प्रत्येक पासवर्ड के लिए एक क्रिप्टोग्राफ़िक रूप से सुरक्षित नमक उत्पन्न करता है और इसके परिणामस्वरूप 60-वर्ण वाली स्ट्रिंग में शामिल होता है। आपको नमक के बारे में चिंता करने की ज़रूरत नहीं होगी!

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

आपका अपना योजना, बहुत कमजोर है पहले आप MD5 उपयोग कर रहे हैं जो पासवर्ड हैश पैदा करने के लिए बहुत तेजी से तरीके है, तो आप एक स्थिर नमक है, जो एक नमक के प्रयोजन धरा का उपयोग करें। शायद आप safely storing passwords के बारे में अपने ट्यूटोरियल को देखना चाहते हैं। अद्यतन सवाल का जवाब देने

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

यह पासवर्ड को __STR जोड़ने के लिए (यदि आप एक काली मिर्च वहाँ बेहतर तरीके हैं जोड़ना चाहते हैं) आवश्यक नहीं है, लेकिन अपने उदाहरण कार्यों वास्तव में काम करना चाहिए। यादृच्छिक नमक की वजह से password_hash() का लौटा मूल्य प्रत्येक बार अलग होगा। यह सही है, फ़ंक्शन password_verify() सत्यापन के लिए इस नमक को निकालने में सक्षम है। आपके मामले में डेटाबेस फ़ील्ड शायद समस्या है। सुनिश्चित करें कि यह 60 वर्ण स्ट्रिंग रख सकता है।

+0

आपकी मदद @martinstoeckli के लिए धन्यवाद। पोस्ट को संपादित करने से पहले मैंने सोचा। वास्तव में मैं हर बार यादृच्छिक हैश स्ट्रिंग समय प्राप्त करने के बारे में उलझन में था। और मुझे नहीं पता था कि कैसे सत्यापित किया जाएगा। लेकिन मुझे पता चला, 'password_verify()' फ़ंक्शन इसका ख्याल रखता है। आपकी सहायता के लिए धन्यवाद. चीयर्स !! –

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