هش کردن رمز عبور با bcrypt در پایتون: امنیت و رمزنگاری
امنیت رمز عبور یکی از مهمترین جنبههای توسعه وب و نرمافزار است. ذخیره رمز عبور کاربران به صورت متن ساده (plain text) یک اشتباه فاجعهبار است که میتواند منجر به دسترسی غیرمجاز به اطلاعات حساس شود. به همین دلیل، استفاده از الگوریتمهای هش (hashing) برای ذخیره رمز عبور ضروری است. bcrypt یکی از قویترین و پرکاربردترین الگوریتمهای هش رمز عبور است که به دلیل مقاومت بالا در برابر حملات brute-force و dictionary attack، به طور گستردهای توصیه میشود.
چرا از هش کردن رمز عبور استفاده میکنیم؟
هنگامی که یک کاربر در یک سیستم ثبتنام میکند، رمز عبور او نباید به صورت متن ساده در پایگاه داده ذخیره شود. در صورت هک شدن پایگاه داده، مهاجمان به تمام رمز عبورهای کاربران دسترسی خواهند داشت. هش کردن رمز عبور این مشکل را حل میکند. به جای ذخیره رمز عبور اصلی، یک مقدار هش شده (hash) از آن ذخیره میشود. هنگامی که کاربر سعی در ورود به سیستم دارد، رمز عبور وارد شده توسط کاربر دوباره هش میشود و با مقدار هش شده ذخیره شده در پایگاه داده مقایسه میشود. اگر دو مقدار هش شده یکسان باشند، کاربر احراز هویت میشود. حتی اگر مهاجم به پایگاه داده دسترسی پیدا کند، فقط مقادیر هش شده را خواهد دید که به تنهایی قابل استفاده برای به دست آوردن رمز عبور اصلی نیستند.
bcrypt چیست و چرا bcrypt؟
bcrypt یک الگوریتم هش رمز عبور است که بر اساس الگوریتم Blowfish طراحی شده است. ویژگیهای کلیدی bcrypt که آن را از سایر الگوریتمهای هش متمایز میکند عبارتند از:
- Adaptive Hashing: bcrypt دارای یک پارامتر به نام “cost factor” است که میزان سختی هش کردن را تعیین میکند. با افزایش cost factor، زمان مورد نیاز برای هش کردن رمز عبور افزایش مییابد. این ویژگی به این معنی است که bcrypt میتواند با افزایش قدرت محاسباتی مهاجمان، به طور خودکار سختی هش کردن را افزایش دهد.
- Salt: bcrypt به طور خودکار یک salt تصادفی برای هر رمز عبور تولید میکند. Salt یک رشته تصادفی است که به رمز عبور قبل از هش کردن اضافه میشود. این کار از حملات rainbow table جلوگیری میکند.
- مقاومت در برابر حملات brute-force: به دلیل cost factor و salt، bcrypt به طور قابل توجهی در برابر حملات brute-force مقاوم است.
نصب کتابخانه bcrypt در پایتون
برای استفاده از bcrypt در پایتون، باید کتابخانه bcrypt را نصب کنید. میتوانید این کار را با استفاده از pip انجام دهید:
pip install bcrypt
پیادهسازی هش کردن رمز عبور با bcrypt در پایتون
در اینجا یک مثال ساده از نحوه هش کردن رمز عبور با bcrypt در پایتون آورده شده است:
import bcrypt
def hash_password(password):
"""
رمز عبور را با استفاده از bcrypt هش میکند.
"""
# تولید salt به صورت خودکار توسط bcrypt
salt = bcrypt.gensalt()
# هش کردن رمز عبور با استفاده از salt و cost factor
hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt)
return hashed_password.decode('utf-8')
def verify_password(password, hashed_password):
"""
رمز عبور وارد شده توسط کاربر را با مقدار هش شده ذخیره شده مقایسه میکند.
"""
# هش کردن رمز عبور وارد شده با استفاده از salt ذخیره شده در مقدار هش شده
hashed_password_bytes = hashed_password.encode('utf-8')
password_bytes = password.encode('utf-8')
if bcrypt.checkpw(password_bytes, hashed_password_bytes):
return True
else:
return False
# مثال استفاده
password = "mysecretpassword"
hashed_password = hash_password(password)
print(f"رمز عبور هش شده: {hashed_password}")
# بررسی رمز عبور
if verify_password(password, hashed_password):
print("رمز عبور معتبر است.")
else:
print("رمز عبور نامعتبر است.")
در این مثال، تابع hash_password رمز عبور را به عنوان ورودی میگیرد و یک مقدار هش شده را برمیگرداند. تابع bcrypt.gensalt() یک salt تصادفی تولید میکند. تابع bcrypt.hashpw() رمز عبور را با استفاده از salt و cost factor هش میکند. مقدار هش شده به صورت رشتهای برگردانده میشود.
تابع verify_password رمز عبور وارد شده توسط کاربر و مقدار هش شده ذخیره شده را به عنوان ورودی میگیرد. تابع bcrypt.checkpw() رمز عبور وارد شده را با استفاده از salt ذخیره شده در مقدار هش شده، هش میکند و با مقدار هش شده ذخیره شده مقایسه میکند. اگر دو مقدار هش شده یکسان باشند، تابع True را برمیگرداند، در غیر این صورت False را برمیگرداند.
Cost Factor در bcrypt
Cost factor یک پارامتر مهم در bcrypt است که میزان سختی هش کردن را تعیین میکند. مقدار پیشفرض cost factor معمولاً 12 است. با این حال، با افزایش قدرت محاسباتی مهاجمان، ممکن است لازم باشد cost factor را افزایش دهید. افزایش cost factor باعث افزایش زمان مورد نیاز برای هش کردن رمز عبور میشود، اما همچنین باعث افزایش زمان مورد نیاز برای احراز هویت کاربر میشود. بنابراین، باید یک تعادل بین امنیت و عملکرد برقرار کنید.
برای تعیین cost factor مناسب، میتوانید از یک تست بنچمارک استفاده کنید. این تست بنچمارک به شما کمک میکند تا بفهمید چه cost factor ای برای سختافزار شما مناسب است. به طور کلی، توصیه میشود از cost factor 12 یا بالاتر استفاده کنید.
برای تنظیم cost factor در پایتون، میتوانید آن را به عنوان آرگومان دوم به تابع bcrypt.hashpw() ارسال کنید:
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt(cost=14))
ذخیره Salt در پایگاه داده
همانطور که قبلاً ذکر شد، bcrypt به طور خودکار یک salt تصادفی برای هر رمز عبور تولید میکند. این salt باید همراه با مقدار هش شده در پایگاه داده ذخیره شود. این کار به این دلیل است که salt برای تأیید رمز عبور مورد نیاز است. در مثال بالا، salt به طور ضمنی در مقدار هش شده ذخیره میشود. به عبارت دیگر، مقدار هش شده شامل salt است. بنابراین، نیازی به ذخیره salt به طور جداگانه در پایگاه داده نیست.
بهترین روشها برای امنیت رمز عبور
علاوه بر استفاده از bcrypt، رعایت بهترین روشهای زیر برای امنیت رمز عبور نیز ضروری است:
- اجبار کاربران به استفاده از رمز عبورهای قوی: رمز عبورهای قوی باید حداقل 12 کاراکتر طول داشته باشند و شامل ترکیبی از حروف بزرگ و کوچک، اعداد و نمادها باشند.
- محدود کردن تعداد تلاشهای ناموفق ورود به سیستم: این کار از حملات brute-force جلوگیری میکند.
- استفاده از احراز هویت دو مرحلهای (2FA): 2FA یک لایه امنیتی اضافی به سیستم اضافه میکند.
- بهروزرسانی منظم کتابخانهها و فریمورکها: این کار از آسیبپذیریهای امنیتی شناخته شده جلوگیری میکند.
- استفاده از HTTPS: HTTPS رمزگذاری ارتباط بین کاربر و سرور را فراهم میکند.
نتیجهگیری
bcrypt یک الگوریتم هش رمز عبور قوی و پرکاربرد است که به طور گستردهای توصیه میشود. با استفاده از bcrypt و رعایت بهترین روشهای امنیت رمز عبور، میتوانید از اطلاعات حساس کاربران خود محافظت کنید. به یاد داشته باشید که امنیت رمز عبور یک فرآیند مداوم است و باید به طور منظم بررسی و بهروزرسانی شود.

بدون دیدگاه