पायथन 3.4 के रूप hashlib
में, मानक पुस्तकालय में मॉड्यूल में मुख्य व्युत्पत्ति कार्य हैं जो "सुरक्षित पासवर्ड हैशिंग" के लिए डिज़ाइन किए गए हैं ।
तो उन में से एक का उपयोग करें, जैसे hashlib.pbkdf2_hmac
, एक नमक के उपयोग से उत्पन्न os.urandom
:
from typing import Tuple
import os
import hashlib
import hmac
def hash_new_password(password: str) -> Tuple[bytes, bytes]:
"""
Hash the provided password with a randomly-generated salt and return the
salt and hash to store in the database.
"""
salt = os.urandom(16)
pw_hash = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
return salt, pw_hash
def is_correct_password(salt: bytes, pw_hash: bytes, password: str) -> bool:
"""
Given a previously-stored salt and hash, and a password provided by a user
trying to log in, check whether the password is correct.
"""
return hmac.compare_digest(
pw_hash,
hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
)
salt, pw_hash = hash_new_password('correct horse battery staple')
assert is_correct_password(salt, pw_hash, 'correct horse battery staple')
assert not is_correct_password(salt, pw_hash, 'Tr0ub4dor&3')
assert not is_correct_password(salt, pw_hash, 'rosebud')
ध्यान दें कि:
- 16-बाइट नमक और PBKDF2 के 100000 पुनरावृत्तियों का उपयोग पायथन डॉक्स में अनुशंसित न्यूनतम संख्याओं से मेल खाता है। आगे पुनरावृत्तियों की संख्या बढ़ने से आपके हैश की गणना धीमी हो जाएगी, और इसलिए अधिक सुरक्षित।
os.urandom
हमेशा यादृच्छिकता के एक गुप्त रूप से सुरक्षित स्रोत का उपयोग करता है
hmac.compare_digest
, में प्रयोग किया जाता है is_correct_password
, मूल रूप से ==
स्ट्रिंग्स के लिए बस ऑपरेटर है, लेकिन शॉर्ट-सर्किट की क्षमता के बिना, जो इसे समय पर हमलों के लिए प्रतिरक्षा बनाता है। यही कारण है कि शायद वास्तव में किसी भी अतिरिक्त सुरक्षा मूल्य प्रदान नहीं करता है , लेकिन यह चोट नहीं करता है, या तो इसलिए मैं अगला कदम उठाते हुए यह प्रयोग किया है।
क्या एक अच्छा पासवर्ड हैश के लिए सिद्धांत और साथ में हैशिंग पासवर्ड के लिए उपयुक्त अन्य कार्यों की एक सूची बनाता है, https://security.stackexchange.com/q/211/29805 देखें ।
t_sha.digest() + salt
। आप नमक को बाद में फिर से विभाजित कर सकते हैं जब आप नमकीन हैश पासवर्ड को डिकोड कर चुके होते हैं, जैसा कि आप जानते हैं कि डिकोडेड हैश पासवर्ड 32 बाइट्स है।