तो, आप bcrypt का उपयोग करना चाहते हैं? बहुत बढ़िया! हालाँकि, क्रिप्टोग्राफी के अन्य क्षेत्रों की तरह, आपको इसे स्वयं नहीं करना चाहिए। यदि आपको चाबियों को प्रबंधित करने, या लवणों को संग्रहीत करने या यादृच्छिक संख्याओं को उत्पन्न करने के बारे में चिंता करने की आवश्यकता है, तो आप इसे गलत कर रहे हैं।
कारण सरल है: यह बहुत तुच्छ है bcrypt को पेंच करना आसान है । वास्तव में, यदि आप इस पृष्ठ के लगभग हर टुकड़े को देखते हैं, तो आप देखेंगे कि यह इन सामान्य समस्याओं में से कम से कम एक का उल्लंघन है।
फेस इट, क्रिप्टोग्राफी कठिन है।
विशेषज्ञों के लिए इसे छोड़ दें। इसे उन लोगों के लिए छोड़ दें जिनका काम इन पुस्तकालयों को बनाए रखना है। यदि आपको कोई निर्णय लेने की आवश्यकता है, तो आप इसे गलत कर रहे हैं।
इसके बजाय, बस एक पुस्तकालय का उपयोग करें। आपकी आवश्यकताओं के आधार पर कई मौजूद हैं।
पुस्तकालय
यहाँ कुछ अधिक सामान्य एपीआई का टूटना है।
PHP 5.5 API - (5.3.7+ के लिए उपलब्ध)
PHP 5.5 में, हैशिंग पासवर्ड के लिए एक नया एपीआई शुरू किया जा रहा है। 5.3.7+ के लिए एक शिम संगतता पुस्तकालय (मेरे द्वारा) बनाए रखा गया है। यह एक सहकर्मी की समीक्षा और कार्यान्वयन का उपयोग करने के लिए सरल होने का लाभ है।
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
वास्तव में, यह अत्यंत सरल होने का लक्ष्य है।
संसाधन:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
यह एक और एपीआई है जो PHP 5.5 एक के समान है, और एक समान उद्देश्य है।
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
संसाधन:
PasswordLib
यह पासवर्ड हैशिंग के लिए थोड़ा अलग दृष्टिकोण है। बस bcrypt का समर्थन करने के बजाय, PasswordLib बड़ी संख्या में हैशिंग एल्गोरिदम का समर्थन करता है। यह मुख्य रूप से संदर्भों में उपयोगी है जहां आपको विरासत और विषम प्रणालियों के साथ संगतता का समर्थन करने की आवश्यकता होती है जो आपके नियंत्रण से बाहर हो सकती हैं। यह बड़ी संख्या में हैशिंग एल्गोरिदम का समर्थन करता है। और 5.3.2+ समर्थित है
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
संदर्भ:
PHPass
यह एक ऐसी परत है जो bcrypt का समर्थन करती है, लेकिन एक काफी मजबूत एल्गोरिथ्म का भी समर्थन करती है जो कि उपयोगी है यदि आपके पास PHP> = 5.3.2 तक नहीं है ... यह वास्तव में PHP 3.0+ (हालांकि bcrypt के साथ नहीं) का समर्थन करता है।
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
साधन
नोट: PHPASS विकल्पों का उपयोग न करें जो ओपनवॉल पर होस्ट नहीं किए गए हैं, वे अलग-अलग प्रोजेक्ट हैं !!!
BCrypt के बारे में
यदि आप ध्यान दें, तो इन पुस्तकालयों में से हर एक एकल स्ट्रिंग लौटाता है। इसका कारण यह है कि BCrypt आंतरिक रूप से कैसे काम करता है। और उस के बारे में जवाब का एक टन कर रहे हैं। यहां एक चयन है जो मैंने लिखा है, कि मैं यहां कॉपी / पेस्ट नहीं करूंगा, लेकिन इसके लिए लिंक:
लपेटें
कई अलग-अलग विकल्प हैं। जो आप चुनते हैं वह आप पर निर्भर है। हालाँकि, मैं आपको अत्यधिक सलाह दूंगा कि आप इसके लिए उपरोक्त पुस्तकालयों में से एक का उपयोग करें।
फिर, यदि आप crypt()
सीधे उपयोग कर रहे हैं, तो आप शायद कुछ गलत कर रहे हैं। यदि आपका कोड उपयोग कर रहा है hash()
(या md5()
या sha1()
) सीधे, आप लगभग निश्चित रूप से कुछ गलत कर रहे हैं।
बस एक पुस्तकालय का उपयोग करें ...