2012-03-04 17 views
23

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

Hashing पासवर्ड है आसान:

import bcrypt 

password = u'foobar' 
password_hashed = bcrypt.hashpw(password, bcrypt.gensalt()) 

# then store password_hashed in a database 

मैं संग्रहीत हैश को एक सादा पाठ पासवर्ड की तुलना कैसे कर सकते हैं?

उत्तर

44

पीई-बीक्रिप्ट के साथ, आपको नमक को अलग से स्टोर करने की आवश्यकता नहीं है: bcrypt हैश में नमक स्टोर करता है।

आप केवल हैश का उपयोग नमक के रूप में कर सकते हैं, और नमक की शुरुआत में नमक संग्रहित होता है।

>>> import bcrypt 
>>> salt = bcrypt.gensalt() 
>>> hashed = bcrypt.hashpw('secret', salt) 
>>> hashed.find(salt) 
0 
>>> hashed == bcrypt.hashpw('secret', hashed) 
True 
>>> 
+4

ग्रेट उत्तर, लेकिन सिर्फ एक एफवाईआई है कि 'हैश' एक पाइथन 2 और 3 आरक्षित कीवर्ड (बिल्टिन func) है, और' हैश = ... 'को सेट किया गया है जो कि आप जिस भी क्षेत्र में हैं, उसमें बिल्टिन को ओवरराइड करता है। मैं इसे बदल दूंगा 'हैशहेड 'या' pw_hash', आदि जैसे कुछ – alichaudry

+0

मैं सहमत हूं। इस 'हैश' को किसी अन्य नाम से प्रतिस्थापित किया जाना चाहिए :)। – ivanleoncz

+0

अपनी स्ट्रिंग को एन्कोड करना न भूलें, 'secret'.encode() '। नोट: पायथन 3 में परीक्षण किया गया। – Yamaneko

5

बाद में, मान लें कि आपके पास उपयोगकर्ता-इनपुट पासवर्ड user_pass है। आप हैश को भी चाहते हैं, और फिर हैश की तुलना संग्रहीत हैश के साथ करें, और यदि वे मेल खाते हैं, तो मूल पासवर्ड भी मेल खाते हैं।

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

सबसे पहले देने का समय:

import bcrypt 

password = u'foobar' 
salt = bcrypt.gensalt() 
password_hashed = bcrypt.hashpw(password, salt) 

# store 'password_hashed' in a database of your choosing 

बाद में बार:

import bcrypt 
password = something_that_gets_input() 

stored_hash = something_that_gets_this_from_the_db() 

if bcrypt.hashpw(password, stored_hash) == stored_hash: 
    # password matches 
+0

धन्यवाद .. यह करने के लिए नए होने के नाते, मैं पूरी तरह से इस तथ्य याद आ रही थी कि नमक और पासवर्ड को संग्रहीत करने की आवश्यकता है और बाद में इसकी तुलना की जानी चाहिए। बहुत बहुत धन्यवाद! – MFB

+2

bcrypt का उपयोग करते समय नमक को स्टोर करने की आवश्यकता नहीं है। नीचे दिया गया जवाब सही है। –

11

प्रलेखन नमक भंडारण उल्लेख नहीं है, यह कहता है तुम बस के लिए:

#Initial generation 
hashed = bcrypt.hashpw(password, bcrypt.gensalt()) 
#Store hashed in your db 

#Load hashed from the db and check the provided password 
if bcrypt.hashpw(password, hashed) == hashed: 
    print "It matches" 
else: 
    print "It does not match" 

http://www.mindrot.org/projects/py-bcrypt/

+0

प्रत्येक बार जब आप bcrypt.gensalt() को कॉल करते हैं तो एक नया नमक उत्पन्न होता है, इसलिए आपको bcrypt.hashpw() के परिणाम के साथ नमक को बचा लेना चाहिए। – skyler

+6

@skyler - bcrypt के साथ, नमक हैश के हिस्से के रूप में संग्रहीत किया जाता है। यह हैश में सहेजा गया है, और हैश की तुलना स्वचालित रूप से इसके खिलाफ की जाती है। –

0

मैं अजगर से परिचित नहीं हूँ, लेकिन मुझे लगता है कि आप का उपयोग कर सकते हैं:
public static boolean checkpw(java.lang.String plaintext, java.lang.String hashed)

// Check that an unencrypted password matches one that has 
// previously been hashed. 
if bcrypt.checkpw(plaintext, hashed): 
    print "It matches" 
else: 
    print "It does not match" 
संबंधित मुद्दे