ایجاد پسورد ایمن با bcrypt پایتون

امیرحسین بیگدلو 4 ماه قبل

در این آموزش با پکیج bcrypt پایتون آشنا خواهید شد که برای ایجاد کردن رمزهای عبور ایمن استفاده میشود. همچنین با مفاهیم اساسی مانند رمزگذاری، هش کردن و اضافه کردن نمک(salt) آشنا خواهید شد.

 

کتابخانه bcrypt پایتون برای ایجاد کردن مقادیر هش قوی استفاده میشود که میتوانید با دستور زیر آن را نصب کنید:

pip install bcrypt

 

 

# رمز گذاری اطلاعات

Encryption فرآیند رمزگذاری یک پیام یا اطلاعات است به گونه ای که فقط افراد مجاز می توانند آن را با کلید مربوطه بخوانند و کسانی که مجاز نیستند نمی توانند. اطلاعات یا پیام مورد نظر، که به عنوان متن ساده(plaintext) نامیده می‌شود، با استفاده از یک الگوریتم رمزگذاری می‌شود. یک رمز متن رمزی تولید می‌کند که فقط در صورت رمزگشایی قابل خواندن است. رمزگذاری یک عملکرد دو طرفه است. وقتی چیزی را رمزگذاری می کنیم، این کار را به قصد رمزگشایی آن انجام می دهیم. رمزگذاری برای محافظت از داده ها هنگام انتقال استفاده می شود.

 

 

# درک مفهوم هش

هش کردن فرآیند استفاده از یک الگوریتم برای نگاشت داده ها با هر اندازه به طول ثابت است. به این مقدار hash می گویند. در حالی که رمزگذاری یک تابع دو طرفه است، هش کردن یک تابع یک طرفه است. در حالی که از نظر فنی امکان هش معکوس یک مقدار وجود دارد، قدرت محاسباتی مورد نیاز آن را غیرممکن می کند. در حالی که رمزگذاری برای محافظت از داده ها در انتقال است، هش برای تأیید عدم تغییر داده ها و معتبر بودن آنها است.

 

هش کردن فقط به امنیت محدود نمی شود. همچنین برای مقایسه مقادیر زیاد داده یا جستجوی سریع کلید استفاده می شود. گذرواژه ها به صورت متن ساده در پایگاه داده ها ذخیره نمی شوند، بلکه در مقادیر هش شده ذخیره می شوند.

 

 

# اضافه کردن نمک

گذرواژه‌ها اغلب به‌عنوان «hashed and salted» توصیف می‌شوند. salt به کاراکترهایی منحصر به فرد گفته میشود که در زمان هش کردن به اطلاعات اضافه میشوند تا پیچیدگی عملیات هش را بیشتر کند. مقدار salt معمولا برای هر کاربر متفاوت خواهد بود. مقدار salt باید توسط سایت ذخیره شود، به این معنی که گاهی اوقات سایت ها از salt یکسان برای هر رمز عبور استفاده می کنند. این باعث می شود که نسبت به استفاده از salt های منفرد، کارایی آن کمتر باشد.

 

 

# عملیات هش کردن رمز عبور با bcrypt پایتون

bcrypt یک تابع هش رمز عبور است که توسط Niels Provos و David Mazières بر اساس رمز Blowfish طراحی شده است. تابع bcrypt الگوریتم پیش‌فرض هش رمز عبور برای OpenBSD است. پیاده‌سازی bcrypt برای C، C++، C#، Java، JavaScript، PHP، Python و سایر زبان‌ها وجود دارد.

 

الگوریتم bcrypt با استفاده از رمزنگاری قوی رمز عبور هش و نمک را برای ما ایجاد می کند. هزینه محاسباتی الگوریتم پارامتری است، بنابراین با افزایش سرعت رایانه ها می توان آن را افزایش داد. هزینه محاسباتی را عامل کار(work factor) یا ضریب هزینه(cost factor) می نامند که هش کردن را کند می کند و تلاش های brute force را سخت تر و کندتر می کند. با افزایش سرعت کامپیوترها، فاکتور هزینه بهینه در طول زمان تغییر می کند. نقطه ضعف فاکتور هزینه بالا افزایش بار روی منابع سیستم و تأثیر بر تجربه کاربر است.

 

در این مثال یک رمز عبور هش شده ایجاد می کنیم:

import bcrypt

passwd = b's$cret12'

salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(passwd, salt)

print(salt)
print(hashed)

 

در کد بالا، ابتدا ماژول bcrypt را ایمپورت کردیم و سپس با استفاده از تابع gensalt یک نمک جدید ایجاد کردیم. مقدار هش با استفاده از تابع hashpw ایجاد میشود که مقدارمتن و نمک را به عنوان آرگومان قبول میکند. اگر کد بالا را اجرا کنید به شکل زیر نتیجه خواهد داد:

b'$2b$12$mwSIOyxLJid1jFLgnU0s0.'
b'$2b$12$mwSIOyxLJid1jFLgnU0s0.7pmzp8Mtx.GEO30x0AbI2v8r2sb98Cy'

 

دقت کنید که بعد از هر بار اجرای کد، هش و نمک تغییر خواهند کرد.

 

بعد از ایجاد کردن هش، میتوانید رمزعبور را با مقدار هش شده مقایسه کنید:

import bcrypt

passwd = b's$cret12'

salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(passwd, salt)

if bcrypt.checkpw(passwd, hashed):
    print("match")
else:
    print("does not match")

 

برای بررسی شباهت رمزعبور و مقدار هش از تابع checkpw استفاده کردیم که به شکل True یا False پاسخ خواهد داد.

مطالب مشابه



مونگارد