दिलचस्प पोस्ट
Fancybox (jQuery) – माता पिता से आइफैम और माता पिता को वापस iframe से पासिंग जानकारी सभी ब्राउज़रों में काम नहीं कर रहे हैं () जावा स्ट्रिंग चर का उपयोग .next () या .nextLine () चेतावनी: mysql_result () पैरामीटर 1 को संसाधन होने की उम्मीद है, बुलियन दिया गया है एंड्रॉइड सूचीदृश्य पंक्ति हटाने एनीमेशन क्यों strncpy नल समाप्त नहीं करता है? Magento – उपयोगकर्ता इनपुट पर आधारित उद्धरण / आदेश उत्पाद आइटम विशेषता उल्का विधि बनाम। अस्वीकार / नियमों को अनुमति दें पैनल से स्विच करने के लिए विभिन्न पैनल कन्स्ट्रक्टरों के अंदर बटन का उपयोग करने के लिए जावा में कार्डलेआउट का प्रभावी ढंग से उपयोग कैसे करें div तत्व पर jquery का आकार बदलना एक जावा इंटरफेस विधि को सार के रूप में क्यों घोषित करेगा? एकाधिक कुंजी में प्राथमिक कुंजी का जिक्र विदेशी कुंजी? `लंबाई / 2` के साथ एक विचलित चर का उपयोग करना HTML5 में दातावादियों के लिए स्क्रॉल पट्टी Jquery – जांच करें कि कम से कम एक चेकबॉक्स चेक किया गया है या नहीं

bcrypt और बेतरतीब ढंग से उत्पन्न लवण

तो मैं बीक्रिप्ट के साथ प्रयोग कर रहा था। मेरे पास एक वर्ग है (नीचे दिखाया गया है, जो मुझे http://www.firedartstudios.com/articles/read/php-security-how-to-safely-store-your-passwords से मिला है) जिसमें 3 फ़ंक्शन हैं पहले एक यादृच्छिक नमक उत्पन्न करना है, दूसरा हैश्त उत्पन्न करने के लिए पहली उत्पन्न नमक का उपयोग करना है और अंतिम वाला हैहेड पासवर्ड के साथ तुलना करके दिए गए पासवर्ड को सत्यापित करना है।

<?php /* Bcrypt Example */ class bcrypt { private $rounds; public function __construct($rounds = 12) { if(CRYPT_BLOWFISH != 1) { throw new Exception("Bcrypt is not supported on this server, please see the following to learn more: http://php.net/crypt"); } $this->rounds = $rounds; } /* Gen Salt */ public function genSalt() { /* openssl_random_pseudo_bytes(16) Fallback */ $seed = ''; for($i = 0; $i < 16; $i++) { $seed .= chr(mt_rand(0, 255)); } /* GenSalt */ $salt = substr(strtr(base64_encode($seed), '+', '.'), 0, 22); /* Return */ return $salt; } /* Gen Hash */ public function genHash($password) { /* Explain '$2y$' . $this->rounds . '$' */ /* 2a selects bcrypt algorithm */ /* $this->rounds is the workload factor */ /* GenHash */ $hash = crypt($password, '$2y$' . $this->rounds . '$' . $this->genSalt()); /* Return */ return $hash; } /* Verify Password */ public function verify($password, $existingHash) { /* Hash new password with old hash */ $hash = crypt($password, $existingHash); /* Do Hashs match? */ if($hash === $existingHash) { return true; } else { return false; } } } /* Next the Usage */ /* Start Instance */ $bcrypt = new bcrypt(12); /* Two create a Hash you do */ echo 'Bcrypt Password: ' . $bcrypt->genHash('password'); /* Two verify a hash you do */ $HashFromDB = $bcrypt->genHash('password'); /* This is an example you would draw the hash from your db */ echo 'Verify Password: ' . $bcrypt->verify('password', $HashFromDB); ?> 

अब अगर मैं उदाहरण के लिए 'पासवर्ड' के साथ एक हैश उत्पन्न करता हूं, तो मुझे एक हैहेड पासवर्ड मिलता है, जिसने लंदन में उत्पन्न नमक ले लिया। अगर मैं 'पासवर्ड' फिर से दर्ज करता हूं और सत्यापन फ़ंक्शन का उपयोग करता हूं, तो मुझे सही अर्थ मिल जाता है कि पासवर्ड मिलते हैं। अगर मैं गलत पासवर्ड दर्ज करता हूं, तो मुझे झूठा लगता है। मेरा प्रश्न यह कैसे संभव है? बेतरतीब ढंग से उत्पन्न नमक के बारे में क्या? कैसे आती है कि इसका कोई प्रभाव नहीं है?

Solutions Collecting From Web of "bcrypt और बेतरतीब ढंग से उत्पन्न लवण"

जिन मूल्यों के साथ आप काम कर रहे हैं, उनमें अच्छा नज़र डालें यादृच्छिक नमक उत्पन्न होगा, कहते हैं:

 abcdefg... 

crypt में क्या खाया जाता है इस तरह दिखता है:

 crypt($password, '$2y$10$abcdefg...') | | | | | +- the salt | +- the cost parameter +- the algorithm type 

परिणाम दिखता है:

 $2y$10$abcdefg...123456789... | | | | | | | +- the password hash | | +- the salt | +- the cost parameter +- the algorithm type 

दूसरे शब्दों में, परिणामी हैश का पहला भाग crypt फ़ंक्शन में मूल इनपुट के समान है; इसमें एल्गोरिदम प्रकार और मापदंडों, यादृच्छिक नमक और हैश परिणाम शामिल हैं।

 Input: $password + $2y$10$abcdefg... Output: $2y$10$abcdefg...123456789... ^^^^^^^^^^^^^^^^^ first part identical 

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

 crypt($passwordToCheck, '$2y$10$abcdefg...123456789...') 

crypt पहले परिभाषित वर्णों को लेता है, अप करने के लिए और abcdefg... शामिल है abcdefg... और बाकी को दूर फेंकता है (इसीलिए नमक को निश्चित वर्णों की जरूरत है)। इसलिए यह पहले के समान ही ऑपरेशन के बराबर है:

 crypt($passwordToCheck, '$2y$10$abcdefg...') 

और एक ही हैश उत्पन्न करेगा, अगर और केवल अगर $passwordToCheck समान है