python - नमक और हैश पाइथन में एक पासवर्ड है




authentication hash (4)

इस प्रश्न के अन्य उत्तरों के आधार पर, मैंने bcrypt का उपयोग करके एक नया दृष्टिकोण लागू किया है।

Bcrypt का उपयोग क्यों करें

अगर मैं सही ढंग से समझता हूं, तो bcrypt पर SHA512 का उपयोग करने का तर्क यह है कि bcrypt को धीमा होने के लिए डिज़ाइन किया गया है। bcrypt यह भी समायोजित करने का विकल्प होता है कि पहली बार हैश किए गए पासवर्ड को उत्पन्न करते समय आप कितनी धीमी हो जाएं:

# The '12' is the number the dictates the 'slowness'
bcrypt.hashpw(password, bcrypt.gensalt( 12 ))

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

कार्यान्वयन

def get_hashed_password(plain_text_password):
    # Hash a password for the first time
    #   (Using bcrypt, the salt is saved into the hash itself)
    return bcrypt.hashpw(plain_text_password, bcrypt.gensalt())

def check_password(plain_text_password, hashed_password):
    # Check hased password. Useing bcrypt, the salt is saved into the hash itself
    return bcrypt.checkpw(plain_text_password, hashed_password)

टिप्पणियाँ

मैं लाइब्रेरी सिस्टम में लाइब्रेरी को आसानी से स्थापित करने में सक्षम था:

pip install py-bcrypt

हालांकि, मुझे अपने विंडोज सिस्टम पर इसे स्थापित करने में और अधिक परेशानी थी। ऐसा लगता है कि एक पैच की जरूरत है। यह Stackoverflow प्रश्न देखें: जीत 7 64 बिट पायथन पर स्थापित py-bcrypt

इस कोड को नमक के साथ एक पासवर्ड हैश माना जाता है। नमक और हैश पासवर्ड डेटाबेस में सहेजा जा रहा है। पासवर्ड स्वयं नहीं है।

ऑपरेशन की संवेदनशील प्रकृति को देखते हुए, मैं यह सुनिश्चित करना चाहता था कि सब कुछ कोशेर था।

नोट: मैं आदत से बाहर b64encode के यूआरएल सुरक्षित संस्करण का उपयोग करें।

import hashlib
import base64
import uuid

password = 'test_password'
salt     = base64.urlsafe_b64encode(uuid.uuid4().bytes)


t_sha = hashlib.sha512()
t_sha.update(password+salt)
hashed_password =  base64.urlsafe_b64encode(t_sha.digest())

इसके लिए पाइथन 3 में काम करने के लिए आपको उदाहरण के लिए यूटीएफ -8 एन्कोड की आवश्यकता होगी:

hashed_password = hashlib.sha512(password.encode('utf-8') + salt.encode('utf-8')).hexdigest()

अन्यथा आप पाएंगे:

ट्रेसबैक (सबसे हालिया कॉल अंतिम):
फाइल "", लाइन 1, में
hashed_password = hashlib.sha512 (पासवर्ड + नमक) .hexdigest ()
TypeError: यूनिकोड-ऑब्जेक्ट्स को हैशिंग से पहले एन्कोड किया जाना चाहिए


यदि आप किसी मौजूदा सिस्टम द्वारा संग्रहीत हैंश का उपयोग करने की आवश्यकता है तो passlib उपयोगी प्रतीत होता है। यदि आपके पास प्रारूप का नियंत्रण है, तो एक आधुनिक हैश का उपयोग करें जैसे कि bcrypt या scrypt। इस समय, पाइथन से उपयोग करने के लिए bcrypt बहुत आसान लगता है।

passlib bcrypt का समर्थन करता है, और यह बैकएंड के रूप में py-bcrypt को स्थापित करने की अनुशंसा करता है: http://pythonhosted.org/passlib/lib/passlib.hash.bcrypt.html

यदि आप पासलिब स्थापित नहीं करना चाहते हैं तो आप सीधे py-bcrypt उपयोग भी कर सकते हैं। रीडमे में बुनियादी उपयोग के उदाहरण हैं।

यह भी देखें: पाइथन में पासवर्ड और नमक के लिए हैश उत्पन्न करने के लिए स्क्रिप का उपयोग कैसे करें


स्मार्ट चीज खुद को क्रिप्टो लिखना नहीं है बल्कि पासलिब जैसे कुछ का उपयोग करना है: https://bitbucket.org/ecollins/passlib/wiki/Home

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

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

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





salt