ब्लोफिश के साथ लंबे पासवर्ड (> 72 अक्षर) कैसे हैश करें


91

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

72 अक्षर की सीमा

ब्लोफिश केवल दर्ज पासवर्ड में पहले 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 वर्णों को देख सकते हैं। Twitter अपने पासवर्ड ( https://shouldichangemypassword.com/twitter-hacked.php ) को संग्रहीत करने के लिए ब्लोफ़िश उर्फ ​​bcrypt का उपयोग कर रहा है और अनुमान लगाता है: 72 से अधिक वर्णों वाले अपने पासवर्ड को लंबे पासवर्ड में बदलें और आप अपने खाते में लॉगिन कर सकते हैं केवल पहले 72 वर्णों में प्रवेश।

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

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

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

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

सुझाव

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 वर्ण दर्ज करके प्रवेश नहीं कर सकता है
  • आप वर्ण-सीमा से अधिक के बिना काली मिर्च जोड़ सकते हैं
  • Hash_hmac का आउटपुट शायद पासवर्ड से अधिक एन्ट्रापी होगा
  • पासवर्ड दो अलग-अलग फ़ंक्शन द्वारा हैशेड किया गया है

विपक्ष

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


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


3
ब्लोफिश केवल एक ही नहीं है जो पासवर्ड को रौंदता है, लोगों को यह सोचने के लिए भ्रमित करता है कि यह वास्तव में सुरक्षित है। यहां 8-चरित्र की सीमा
DOK

2
72-चरित्र ट्रंकेशन ब्लोफ़िश एल्गोरिथ्म, या बस PHP कार्यान्वयन के लिए मौलिक है? IIRC ब्लोफिश का उपयोग उपयोगकर्ता पासवर्ड एन्क्रिप्ट करने के लिए (कम से कम कुछ) निक्स पर भी किया जाता है।
डगलस बी। स्टेपल

3
मुद्दा Bcrypt के साथ है, ब्लोफिश के साथ नहीं। मैं अकेले पायथन और Bcrypt के साथ इस समस्या को पुन: उत्पन्न कर सकता हूं।
ब्लेंडर

@ ब्लेंडर: आपकी टिप्पणी और उस पर आपके काम के लिए धन्यवाद। मैं ब्लोफिश और bcrypt के लिए php में अलग-अलग फ़ंक्शन नहीं ढूंढ सका और हालांकि वे समान हैं। लेकिन यह मेरे लिए PHP में कोई फर्क नहीं पड़ता? मैं मानक php फ़ंक्शन का उपयोग करना पसंद करूंगा।
फ्रेडरिक कम्मर

1
ओपनवॉल का PHP पासवर्ड हैशिंग ढाँचा (PHPass) भी देखें। उपयोगकर्ता पासवर्ड पर कई आम हमलों के खिलाफ इसकी पोर्टेबल और कठोर। जिस व्यक्ति ने फ्रेमवर्क (सोलरडिजाइनर) लिखा है, वह वही व्यक्ति है जिसने जॉन द रिपर लिखा था और पासवर्ड हैशिंग प्रतियोगिता में एक न्यायाधीश के रूप में बैठता है । इसलिए वह पासवर्ड पर हमलों के बारे में एक या दो चीजें जानता है।
jww

जवाबों:


134

यहाँ समस्या मूल रूप से एन्ट्रापी की समस्या है। तो चलिए देखना शुरू करते हैं:

प्रवेश प्रति चरित्र

प्रति बाइट एन्ट्रापी के बिट्स की संख्या हैं:

  • हेक्स वर्ण
    • बिट्स: 4
    • मान: 16
    • एन्ट्रॉपी इन 72 चार्ट्स: 288 बिट्स
  • अल्फा-न्यूमेरिक
    • बिट्स: 6
    • मान: 62
    • एन्ट्रॉपी इन 72 चार्ट्स: 432 बिट्स
  • "आम" प्रतीक
    • बिट्स: 6.5
    • मान: 94
    • एन्ट्रॉपी इन 72 चार्ट्स: 468 बिट्स
  • पूर्ण बाइट्स
    • बिट्स: 8
    • मान: 255
    • एन्ट्रॉपी इन 72 चार्ट्स: 576 बिट्स

इसलिए, हम कैसे कार्य करते हैं, इस पर निर्भर करता है कि हम किस प्रकार के पात्रों की अपेक्षा करते हैं।

पहली समस्या

आपके कोड के साथ पहली समस्या यह है कि आपका "काली मिर्च" हैश कदम हेक्स वर्णों को आउटपुट कर रहा है (चूंकि चौथा पैरामीटर hash_hmac()सेट नहीं है)।

इसलिए, अपनी काली मिर्च को हैशिंग में, आप प्रभावी रूप से 2 (576 से 288 संभावित बिट्स) के कारक द्वारा पासवर्ड के लिए उपलब्ध अधिकतम एन्ट्रापी को काट रहे हैं ।

दूसरी समस्या

हालांकि, sha256केवल 256पहले स्थान पर एंट्रोपी के टुकड़े प्रदान करता है। तो आप प्रभावी रूप से 576 बिट्स को 256 बिट्स तक प्रभावी रूप से काट रहे हैं। आपका हैश चरण * तुरंत *, बहुत परिभाषा से पासवर्ड में कम से कम 50% संभावित एन्ट्रोपी खो देता है ।

आप इसे आंशिक रूप से उस पर स्विच करके हल कर सकते हैं SHA512, जहाँ आप केवल उपलब्ध एंट्रॉपी को लगभग 12% कम कर देंगे। लेकिन यह अभी भी एक महत्वहीन अंतर है। वह 12% के एक कारक द्वारा क्रमपरिवर्तन की संख्या को कम करता है 1.8e19। यह एक बड़ी संख्या है ... और यह वह कारक है जो इसे कम करता है ...

अवर मुद्दा

अंतर्निहित मुद्दा यह है कि 72 वर्णों से अधिक तीन प्रकार के पासवर्ड हैं। इस शैली प्रणाली का उन पर प्रभाव बहुत अलग होगा:

नोट: यहां से मैं मान रहा हूं कि हम एक काली मिर्च प्रणाली की तुलना कर रहे हैं जो SHA512कच्चे आउटपुट (हेक्स नहीं) के साथ उपयोग करता है ।

  • उच्च एन्ट्रापी यादृच्छिक पासवर्ड

    ये आपके उपयोगकर्ता हैं जो पासवर्ड जेनरेटर का उपयोग करते हैं जो पासवर्ड के लिए बड़ी कुंजी को उत्पन्न करते हैं। वे यादृच्छिक (उत्पन्न, मानव चुने हुए नहीं) हैं, और प्रति चरित्र उच्च एन्ट्रापी हैं। ये प्रकार उच्च-बाइट्स (वर्ण> 127) और कुछ नियंत्रण वर्ण का उपयोग कर रहे हैं।

    इस समूह के लिए, आपका हैशिंग फ़ंक्शन उनके उपलब्ध एन्ट्रापी को काफी कम कर देगा bcrypt

    मुझे फिर वही बात कहना है। उन उपयोगकर्ताओं के लिए जो उच्च एन्ट्रापी, लंबे पासवर्ड का उपयोग कर रहे हैं, आपके समाधान से उनके पासवर्ड की शक्ति काफी कम हो जाती है। (72 वर्ण कूटशब्द के लिए एन्ट्रापी के 62 बिट्स खो गए, और अधिक लंबे पासवर्ड के लिए)

  • मध्यम एन्ट्रापी यादृच्छिक पासवर्ड

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

    इस समूह के लिए, आप अधिक एन्ट्रॉपी को थोड़ा अनलॉक करने जा रहे हैं (इसे न बनाएं, लेकिन अधिक एन्ट्रापी को bcrypt पासवर्ड में फिट होने दें)। जब मैं थोड़ा कहता हूं, तो मेरा मतलब थोड़ा होता है। ब्रेक-इवन तब भी होता है जब आप SHA512 के 512 बिट्स को अधिकतम करते हैं। इसलिए, शिखर 78 वर्णों पर है।

    मुझे फिर वही बात कहना है। पासवर्डों की इस श्रेणी के लिए, आप एंट्रॉपी से बाहर निकलने से पहले केवल एक अतिरिक्त 6 अक्षर स्टोर कर सकते हैं।

  • कम एन्ट्रापी गैर-यादृच्छिक पासवर्ड

    यह वह समूह है जो अल्फा-न्यूमेरिक वर्णों का उपयोग कर रहे हैं, जो शायद यादृच्छिक रूप से उत्पन्न नहीं होते हैं। एक बाइबिल बोली या ऐसा कुछ। इन वाक्यांशों में प्रति वर्ण लगभग 2.3 बिट्स एन्ट्रापी हैं।

    इस समूह के लिए, आप बहुत से एन्ट्रॉपी को अनलॉक कर सकते हैं (इसे न बनाएं, लेकिन अधिक जानकारी को bcrypt पासवर्ड इनपुट में फिट करने की अनुमति दें)। जब आप एन्ट्रापी से बाहर निकलते हैं, तो ब्रेकेवन लगभग 223 अक्षर का होता है।

    चलिए फिर बताते हैं। पासवर्ड के इस वर्ग के लिए, प्री-हैशिंग निश्चित रूप से सुरक्षा में काफी वृद्धि करता है।

असली दुनिया में वापस

इस तरह की एन्ट्रापी गणना वास्तव में वास्तविक दुनिया में ज्यादा मायने नहीं रखती है। क्या मामलों में एंट्रोपी अनुमान लगा रही है। हमलावरों क्या कर सकते हैं कि सीधे प्रभाव। यही आप अधिकतम करना चाहते हैं।

हालांकि वहाँ थोड़ा अनुसंधान है कि एंट्रोपी अनुमान लगाने में चला गया है, कुछ बिंदु हैं जो मैं इंगित करना चाहता हूं।

एक पंक्ति में बेतरतीब ढंग से 72 सही पात्रों की संभावना बेहद कम है। इस टक्कर के होने की तुलना में, आपको 21 बार पॉवरबॉल लॉटरी जीतने की संभावना है ... यह एक बड़ी संख्या है जिसके बारे में हम बात कर रहे हैं।

लेकिन हम इस पर सांख्यिकीय रूप से नहीं ठोकर खा सकते हैं। वाक्यांशों के मामले में पहले 72 अक्षरों के होने की संभावना यादृच्छिक पासवर्ड के लिए पूरी तरह से बहुत अधिक है। लेकिन यह अभी भी तुच्छ रूप से कम है (आप प्रति वर्ण 2.3 बिट्स के आधार पर 5 बार पावरबॉल लॉटरी जीतने की अधिक संभावना है)।

वास्तव में

व्यावहारिक रूप से, यह वास्तव में मायने नहीं रखता है। पहले 72 वर्णों के सही होने का अनुमान लगाने की संभावना, जहां बाद वाले महत्वपूर्ण अंतर रखते हैं, वे इतने कम होते हैं कि यह चिंता करने लायक नहीं है। क्यों?

ठीक है, मान लें कि आप एक वाक्यांश ले रहे हैं। यदि व्यक्ति को पहले 72 अक्षर सही मिल सकते हैं, तो वे वास्तव में भाग्यशाली हैं (संभावना नहीं है), या यह एक सामान्य वाक्यांश है। यदि यह एक सामान्य वाक्यांश है, तो इसे बनाने के लिए एकमात्र चर कितना लंबा है।

एक उदाहरण लेते हैं। आइए बाईबल से एक उद्धरण लें (सिर्फ इसलिए कि यह लंबे पाठ का एक सामान्य स्रोत है, किसी अन्य कारण से नहीं):

आप अपने पड़ोसी के घर को लालच नहीं देंगे। आप अपने पड़ोसी की पत्नी, या उसकी हवेली या नौकरानी, ​​उसके बैल या गधे, या आपके पड़ोसी की किसी भी चीज़ का लालच नहीं करेंगे।

वह 180 अक्षर का है। 73 वां वर्ण gदूसरे में है neighbor's। यदि आपने ऐसा अनुमान लगाया है, तो आप संभवत: रोक नहीं रहे हैं nei, लेकिन शेष कविता के साथ जारी है (क्योंकि पासवर्ड का उपयोग किए जाने की संभावना है)। इसलिए, आपके "हैश" ने बहुत कुछ नहीं जोड़ा।

BTW: मैं ABSOLUTELY एक बाइबिल बोली का उपयोग करने की वकालत नहीं कर रहा हूँ। वास्तव में, ठीक इसके विपरीत।

निष्कर्ष

आप वास्तव में पहले हैशिंग द्वारा लंबे पासवर्ड का उपयोग करने वाले लोगों की मदद करने वाले नहीं हैं। कुछ समूह आप निश्चित रूप से मदद कर सकते हैं। कुछ आप निश्चित रूप से चोट कर सकते हैं।

लेकिन अंत में, इसमें से कोई भी अत्यधिक महत्वपूर्ण नहीं है। संख्या हम साथ काम कर रहे बस कर रहे हैं रास्ता बहुत अधिक है। एन्ट्रापी में अंतर ज्यादा होने वाला नहीं है।

आप bcrypt को छोड़ना बेहतर समझते हैं। आपके पास हैशिंग (शाब्दिक रूप से पेंच करने की अधिक संभावना है, आपने इसे पहले ही कर लिया है, और आप उस गलती से पहले, या अंतिम नहीं हैं) जिस हमले को आप रोकने की कोशिश कर रहे हैं वह होने जा रहा है।

बाकी साइट को सुरक्षित करने पर ध्यान दें। और पासवर्ड की शक्ति को इंगित करने के लिए पंजीकरण पर पासवर्ड बॉक्स में एक पासवर्ड एन्ट्रापी मीटर जोड़ें (और इंगित करें कि क्या पासवर्ड अधिक है कि उपयोगकर्ता इसे बदलना चाह सकता है) ...

कि मेरी $ 0.02 कम से कम (या संभवतः $ 0.02 से अधिक है) ...

जहां तक ​​"सीक्रेट" काली मिर्च का उपयोग करने की बात है:

शाब्दिक रूप से bcrypt में एक हैश फ़ंक्शन को खिलाने में कोई शोध नहीं है। इसलिए, यह सबसे अच्छा नहीं है अगर bcrypt में "peppered" हैश को खिलाने से कभी अज्ञात कमजोरियां होंगी (हम जानते हैं कि hash1(hash2($value))टकराव प्रतिरोध और प्राइमेज हमलों के आसपास महत्वपूर्ण कमजोरियों को उजागर कर सकते हैं)।

यह देखते हुए कि आप पहले से ही एक गुप्त कुंजी ("काली मिर्च") के भंडारण पर विचार कर रहे हैं, इसका उपयोग इस तरह से क्यों नहीं किया जाता है जो अच्छी तरह से अध्ययन और समझ में आता है? इसे संग्रहीत करने से पहले हैश को एन्क्रिप्ट क्यों नहीं किया जाता है?

असल में, आपके पास पासवर्ड हैश करने के बाद, पूरे हैश आउटपुट को एक मजबूत एन्क्रिप्शन एल्गोरिथ्म में फीड करें। फिर एन्क्रिप्टेड परिणाम को स्टोर करें।

अब, SQL- इंजेक्शन का हमला कुछ भी उपयोगी नहीं होगा, क्योंकि उनके पास सिफर कुंजी नहीं है। और अगर चाबी लीक हो जाती है, तो हमलावर आपसे बेहतर नहीं हैं यदि आपने एक सादे हैश का उपयोग किया है (जो कि सिद्ध है, काली मिर्च "प्री-हैश" प्रदान नहीं करता है)।

नोट: यदि आप ऐसा करने के लिए चुनते हैं, तो एक पुस्तकालय का उपयोग करें। PHP के लिए, मैं दृढ़ता से Zend फ्रेमवर्क 2 के Zend\Cryptपैकेज की सिफारिश करता हूं । यह वास्तव में केवल एक ही है जिसे मैं इस वर्तमान बिंदु पर सुझाऊँगा। इसकी जोरदार समीक्षा की गई है, और यह आपके लिए सभी निर्णय लेता है (जो कि बहुत अच्छी बात है) ...

कुछ इस तरह:

use Zend\Crypt\BlockCipher;

public function createHash($password) {
    $hash = password_hash($password, PASSWORD_BCRYPT, ["cost"=>$this->cost]);

    $blockCipher = BlockCipher::factory('mcrypt', array('algo' => 'aes'));
    $blockCipher->setKey($this->key);
    return $blockCipher->encrypt($hash);
}

public function verifyHash($password, $hash) {
    $blockCipher = BlockCipher::factory('mcrypt', array('algo' => 'aes'));
    $blockCipher->setKey($this->key);
    $hash = $blockCipher->decrypt($hash);

    return password_verify($password, $hash);
}

और यह फायदेमंद है क्योंकि आप सभी एल्गोरिदम का उपयोग उन तरीकों से कर रहे हैं जिन्हें अच्छी तरह से समझा जाता है और अच्छी तरह से अध्ययन किया जाता है (अपेक्षाकृत कम से कम)। याद है:

कोई भी, सबसे क्लूलेस शौकिया से सर्वश्रेष्ठ क्रिप्टोग्राफर तक, एक एल्गोरिथ्म बना सकता है जिसे वह खुद नहीं तोड़ सकता।


6
इस विस्तृत उत्तर के लिए बहुत-बहुत धन्यवाद। यह वास्तव में मेरी मदद करता है!
फ्रेडरिक कम्मर

1
इस जवाब के लिए मेरी तारीफ। हालांकि, यह उपयोगकर्ताओं का बड़ा बहुमत है, जो बहुत कमज़ोर पासवर्डों, शब्दों और व्युत्पन्न पासवर्डों को क्रैकिंग पासवर्ड के लिए इस्तेमाल करते हैं, एक मिर्ची-पिक पिक, पासवर्ड को क्रैक करने के लिए उन्हें स्वतंत्र करेगा। हारने वाली ट्रॉफी से बचने के लिए, आप केवल पासवर्ड और काली मिर्च को मिला सकते हैं। हालाँकि हैश-मान एन्क्रिप्ट करने के बारे में आपका सुझाव संभवतः सर्वर-साइड रहस्य को जोड़ने का सबसे अच्छा समाधान है।
Martinstoeckli

2
@martinstoeckli: काली मिर्च की अवधारणा के साथ मेरा मुद्दा इसके मूल्य में नहीं है। ऐसा नहीं है कि क्रिप्टोग्राफिक एल्गोरिदम के संदर्भ में "काली मिर्च" का अनुप्रयोग अपरिवर्तित क्षेत्र में जाता है। यह अच्छी बात नहीं है। इसके बजाय, मेरा मानना ​​है कि क्रिप्टोग्राफिक प्राइमेटिव्स को इस तरह से जोड़ा जाना चाहिए कि वे एक साथ जाने के लिए डिज़ाइन किए गए थे। मूल रूप से, एक काली मिर्च की मूल अवधारणा मेरे कानों में मुझे सुनाई देती है, जैसे कुछ लोग जो क्रिप्टोग्राफी के बारे में कुछ नहीं जानते थे, उन्होंने कहा "अधिक राख बेहतर हैं! हमारे पास नमक है, काली मिर्च भी अच्छी है!" । मैं सिर्फ एक सरल, अधिक परीक्षित और अधिक सीधे आगे
निहित करना चाहता हूँ

@ircmaxell - हां, मुझे आपकी बात पता है और मैं सहमत हूं, जब तक कि बाद में हैश-मान एन्क्रिप्ट किया जाएगा। यदि आप यह अतिरिक्त कदम नहीं उठाते हैं, तो एक शब्दकोश हमले में बहुत सारे कमजोर पासवर्ड दिखाई देंगे, यहां तक ​​कि एक अच्छे हैश एल्गोरिथ्म के साथ भी।
Martinstoeckli

@martinstoeckli: मैं वहां असहमत हूं। रहस्यों को संग्रहित करना कोई मामूली बात नहीं है। इसके बजाय, यदि आप एक अच्छी लागत (12 आज) के साथ bcrypt का उपयोग करते हैं, तो सभी कमजोर वर्ग के पासवर्ड सुरक्षित हैं (शब्दकोश, और तुच्छ पासवर्ड सबसे कमजोर हैं)। इसलिए मैं लोगों को यह सलाह दूंगा कि वे उपयोगकर्ता को शक्ति मीटर के साथ शिक्षित करने और उन्हें पहले स्थान पर बेहतर पासवर्ड का उपयोग करने पर ध्यान दें ...
ircmaxell

5

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

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

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

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

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

PS जहाँ तक मुझे पता है, 72 वर्ण सीमा ही BCrypt के एल्गोरिथ्म के लिए विशिष्ट है। मुझे मिला सबसे अच्छा जवाब यह है

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


आपके पीपीएस के बारे में, मैं सिर्फ इतना कह सकता हूं: हां, वह बिना छेड़े एक के हैश के साथ ट्रंक किए गए पासवर्ड को सत्यापित कर सकता है और फिर भी प्राप्त कर सकता है true। यही सवाल है। खुद देखिए: viper-7.com/RLKFnB
Sliq

@Panique - समस्या BCrypt हैश की गणना नहीं है, इससे पहले HMAC है। SHA हैश उत्पन्न करने के लिए, ओपी पूरी लंबाई के पासवर्ड का उपयोग करता है और BCrypt के इनपुट के रूप में परिणाम का उपयोग करता है। सत्यापन के लिए, वह SHA हैश की गणना करने से पहले पासवर्ड को काट देता है, फिर BCrypt के इनपुट के रूप में इस पूरी तरह से अलग परिणाम का उपयोग करता है। HMAC किसी भी लम्बाई के इनपुट को स्वीकार करता है।
मार्टिन्स्टेकली

2

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

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

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

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

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


1
"पासवर्ड एक्सपायरी भी कम होनी चाहिए," बड़े पैमाने पर लंबे पासवर्ड "के 2 सप्ताह" की तरह, वास्तव में, पासवर्ड को बचाने के लिए भी परेशान क्यों करें, बस हर बार पासवर्ड रीसेट का उपयोग करें। गंभीरता से, यह गलत समाधान है, टोकन के साथ दो कारक प्रमाणीकरण पर जाएं।
ज़ाफ़

धन्यवाद @ ज़ाफ़। क्या आप इसका एक उदाहरण बता पा रहे हैं? यह दिलचस्प लगता है।
फिल

[DRAFT NIST स्पेशल पब्लिकेशन 800-63B डिजिटल ऑथेंटिकेशन गाइडलाइन] ( Pages.nist.gov/800-63-3/sp800-63b.html ), 5.1.1.2। मेमोरियल सीक्रेट वेरिफ़ायर: वेरिफायर शॉल्ड को मनमाने ढंग से (उदाहरण के लिए, समय-समय पर) बदलने के लिए मेमोरेटेड सीक्रेट्स की आवश्यकता नहीं होती है । जिम फेंटन द्वारा टॉवर्ड बेटर पासवर्ड रिक्वायरमेंट्स भी देखें ।
ज़ाफ़

1
बात यह है कि अधिक बार एक उपयोगकर्ता को पासवर्ड बदलने की आवश्यकता होती है सबसे खराब पासवर्ड विकल्प इस प्रकार सुरक्षा को कम करते हैं। उपयोगकर्ता के पास अच्छे याद रखने योग्य पासवर्ड की एक सीमित मात्रा है और वे बाहर भागते हैं, या तो वास्तव में खराब पासवर्ड चुनते हैं या उन्हें पोस्ट-
इट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.