php - Blowfish के साथ हैश लंबे पासवर्ड(> 72 वर्ण) कैसे है




security hash (2)

Bcrypt महंगा Blowfish कुंजी सेटअप एल्गोरिदम के आधार पर एक एल्गोरिदम का उपयोग करता है।

Bcrypt के लिए अनुशंसित 56 बाइट पासवर्ड सीमा (शून्य समाप्ति बाइट समेत) Blowfish कुंजी की 448 बिट सीमा से संबंधित है। उस सीमा से परे किसी भी बाइट परिणामी हैश में पूरी तरह से मिश्रित नहीं हैं। Bcrypt पासवर्ड पर 72 बाइट पूर्ण सीमा इसलिए कम प्रासंगिक है, जब आप उन बाइट्स द्वारा परिणामी हैश पर वास्तविक प्रभाव पर विचार करते हैं।

यदि आपको लगता है कि आपके उपयोगकर्ता आमतौर पर 55 बाइट्स से अधिक पासवर्ड चुनते हैं, तो याद रखें कि आप पासवर्ड टेबल उल्लंघन के मामले में सुरक्षा बढ़ाने के लिए हमेशा पासवर्ड के राउंड को बढ़ा सकते हैं (हालांकि इसे अतिरिक्त जोड़ने के साथ बहुत कुछ होना चाहिए वर्ण)। यदि उपयोगकर्ताओं के अभिगम अधिकार इतने महत्वपूर्ण हैं कि उपयोगकर्ताओं को आम तौर पर बड़े पैमाने पर लंबे पासवर्ड की आवश्यकता होती है, तो पासवर्ड की समाप्ति भी कम होनी चाहिए, जैसे कि 2 सप्ताह। इसका अर्थ यह है कि एक हैकर वैध होने की संभावना कम है, जबकि एक हैकर प्रत्येक परीक्षण पासवर्ड का परीक्षण करने में शामिल कार्य कारक को हराने में अपने संसाधनों को निवेश करता है ताकि यह देखने के लिए कि यह एक मिलान हैश उत्पन्न करेगा या नहीं।

बेशक, पासवर्ड टेबल के उल्लंघन के मामले में, हमें केवल उपयोगकर्ता के खाते को लॉक करने से पहले, उपयोगकर्ता के 55 बाइट पासवर्ड का अनुमान लगाने के दस प्रयासों को हैकर्स को अनुमति देना चाहिए;)

यदि आप 55 बाइट्स से अधिक पासवर्ड वाले प्री-हैश का निर्णय लेते हैं, तो आपको SHA-384 का उपयोग करना चाहिए, क्योंकि इसकी सीमा के बिना सबसे बड़ा आउटपुट है।

पिछले हफ्ते मैंने पासवर्ड हैशिंग और ब्लॉफिश के बारे में बहुत सारे लेख पढ़े हैं (अभी में) सबसे अच्छा हैशिंग एल्गोरिदम है - लेकिन यह इस सवाल का विषय नहीं है!

72 वर्ण सीमा

Blowfish केवल दर्ज पासवर्ड में पहले 72 वर्णों पर विचार करें:

<?php
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$hash = password_hash($password, PASSWORD_BCRYPT);
var_dump($password);

$input = substr($password, 0, 72);
var_dump($input);

var_dump(password_verify($input, $hash));
?>

आउटपुट है:

string(119) "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)"
string(72) "Wow. This is a super secret and super, super long password. Let's add so"
bool(true)

जैसा कि आप केवल पहले 72 वर्णों को देख सकते हैं। ट्विटर अपने पासवर्ड ( https://shouldichangemypassword.com/twitter-hacked.php ) को स्टोर करने के लिए blowfish उर्फ ​​bcrypt का उपयोग कर रहा है और अनुमान लगाएं: 72 से अधिक वर्णों के साथ अपने ट्विटर पासवर्ड को लंबे पासवर्ड में बदलें और आप अपने खाते में लॉगिन कर सकते हैं केवल पहले 72 वर्णों में प्रवेश करना।

ब्लोफिश और काली मिर्च

"मिर्चिंग" पासवर्ड के बारे में बहुत अलग राय हैं। कुछ लोग कहते हैं कि यह अनावश्यक है, क्योंकि आपको यह मानना ​​है कि गुप्त काली मिर्च-स्ट्रिंग भी ज्ञात / प्रकाशित है, इसलिए यह हैश को बढ़ाता नहीं है। मेरे पास एक अलग डेटाबेस सर्वर है, इसलिए यह काफी संभव है कि केवल डेटाबेस लीक हो और स्थिर मिर्च न हो।

इस मामले में (काली मिर्च लीक नहीं) आप एक शब्दकोश के आधार पर एक हमला करते हैं और अधिक कठिन (सही है अगर यह सही नहीं है)। यदि आपकी काली मिर्च-स्ट्रिंग भी लीक हो जाती है: वह बुरा नहीं - आपके पास अभी भी नमक है और यह मिर्च के बिना हैश के रूप में अच्छी तरह से संरक्षित है।

तो मुझे लगता है कि पासवर्ड काली मिर्च कम से कम कोई बुरा विकल्प नहीं है।

सुझाव

72 से अधिक वर्ण (और काली मिर्च) वाले पासवर्ड के लिए ब्लॉफिश हैश प्राप्त करने का मेरा सुझाव है:

<?php
$pepper = "foIwUVmkKGrGucNJMOkxkvcQ79iPNzP5OKlbIdGPCMTjJcDYnR";

// Generate Hash
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$password_peppered = hash_hmac('sha256', $password, $pepper);
$hash = password_hash($password_peppered, PASSWORD_BCRYPT);

// Check
$input = substr($password, 0, 72);
$input_peppered = hash_hmac('sha256', $input, $pepper);

var_dump(password_verify($input_peppered, $hash));
?>

यह इस प्रश्न पर आधारित है: password_verify वापसी false

प्रश्न

सुरक्षित तरीका क्या है? पहले SHA-256 हैश प्राप्त करना (जो 64 वर्ण देता है) या पासवर्ड के पहले 72 वर्णों पर विचार करें?

पेशेवरों

  • उपयोगकर्ता केवल पहले 72 वर्ण दर्ज करके लॉगिन नहीं कर सकता है
  • आप वर्ण-सीमा से अधिक के बिना काली मिर्च जोड़ सकते हैं
  • हैश_हैमैक के आउटपुट में पासवर्ड की तुलना में शायद अधिक एन्ट्रॉपी होगी
  • पासवर्ड दो अलग-अलग कार्यों से धोया जाता है

विपक्ष

  • ब्लाफिश हैश बनाने के लिए केवल 64 वर्णों का उपयोग किया जाता है


1 संपादित करें: यह प्रश्न केवल blowfish / bcrypt के PHP एकीकरण को संबोधित करता है। टिप्पणियों के लिए धन्यवाद!


पेपरिंग पासवर्ड निश्चित रूप से करने के लिए एक अच्छी बात है, लेकिन देखते हैं क्यों।

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

फिर काली मिर्च वास्तव में क्या मदद करता है? जब तक काली मिर्च गुप्त रहता है, तब तक यह एक शब्दकोश हमले से कमजोर पासवर्ड की रक्षा करता है। पासवर्ड 1234 फिर 1234-p*deDIUZeRweretWy+.O जैसे कुछ बन जाएगा। 1234-p*deDIUZeRweretWy+.O । यह पासवर्ड केवल इतना लंबा नहीं है, इसमें विशेष वर्ण भी शामिल हैं और कभी भी किसी भी शब्दकोश का हिस्सा नहीं होंगे।

अब हम अनुमान लगा सकते हैं कि हमारे उपयोगकर्ता किस पासवर्ड का उपयोग करेंगे, शायद अधिक उपयोगकर्ता कमजोर पासवर्ड दर्ज करेंगे, क्योंकि 64-72 वर्णों के बीच पासवर्ड वाले उपयोगकर्ता हैं (वास्तव में यह बहुत दुर्लभ होगा)।

एक और बिंदु ब्रूट-फोर्सिंग की सीमा है। Sha256 हैश फ़ंक्शन 256 बिट्स आउटपुट या 1.2E77 संयोजनों को वापस कर देगा, जीपीयू के लिए भी ब्रूट-फोर्सिंग के लिए बहुत अधिक तरीके हैं (यदि मैंने सही ढंग से गणना की है, तो 2013 में जीपीयू पर 2E61 साल की आवश्यकता होगी)। इसलिए हमें मिर्च लगाने का वास्तविक नुकसान नहीं मिलता है। चूंकि हैश-वैल्यू व्यवस्थित नहीं हैं, इसलिए आप सामान्य पैटर्न के साथ ब्रूट-फोर्सिंग को तेज नहीं कर सकते हैं।

पीएस जहां तक ​​मुझे पता है, 72 वर्ण सीमा बीसीआरपीटी के एल्गोरिदम के लिए विशिष्ट है। मुझे मिला सबसे अच्छा जवाब this ।

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





blowfish