পাইথন ৩.৪ অনুসারে, 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')
মনে রাখবেন যে:
- পিবিকেডিএফ 2 এর 16-বাইট লবণ এবং 100000 পুনরাবৃত্তির ব্যবহার পাইথন ডক্সে প্রস্তাবিত সর্বনিম্ন সংখ্যার সাথে মেলে। পুনরাবৃত্তির সংখ্যা আরও বৃদ্ধি করা আপনার হ্যাশগুলি গণনা করতে ধীর করে দেবে এবং এর ফলে আরও সুরক্ষিত হবে।
os.urandom
সর্বদা এলোমেলোতার একটি ক্রিপ্টোগ্রাফিক নিরাপদ উত্স ব্যবহার করে
hmac.compare_digest
ব্যবহৃত is_correct_password
, এটি মূলত কেবল ==
স্ট্রিংগুলির জন্য অপারেটর তবে শর্ট সার্কিটের ক্ষমতা ছাড়াই, যা এটি টাইমিং আক্রমণে প্রতিরোধক করে তোলে। এটি সম্ভবত কোনও অতিরিক্ত সুরক্ষা মান সরবরাহ করে না তবে এটির কোনও ক্ষতি হয় না, তাই আমি এগিয়ে গিয়ে ব্যবহার করেছি।
কী কারণে একটি ভাল পাসওয়ার্ড হ্যাশ তৈরি হয় এবং অন্যান্য পাসওয়ার্ডগুলির সাথে পাসওয়ার্ডগুলি হ্যাশ করার জন্য উপযুক্ত অন্যান্য কার্যগুলির তালিকা তৈরি করার তত্ত্বের জন্য, https://security.stackexchange.com/q/211/29805 দেখুন ।
t_sha.digest() + salt
। আপনি লবণযুক্ত হ্যাশ পাসওয়ার্ডটি ডিকোড করার পরে লবণটি আবার বিভক্ত করতে পারেন কারণ আপনি জানেন যে ডিকোডড হ্যাশ পাসওয়ার্ডটি হুবহু 32 বাইট।