۰۰۵ پایتون و ماژول هفته – رمزنگاری – قسمت اول hashlib

مقدمه

در جلسه چهارم به بررسی کتابخونه difflib پرداختیم. در این قسمت و قسمت بعدی، امکاناتی که پایتون در رابطه با رمزنگاری در اختیارمون گذاشته رو بررسی می کنیم. امروز نگاهی میندازیم به کتابخونه hashlib. این اسم مخفف hash library هستش. خیلی منطقی!

اگر با هش ها آشنایی ندارید، پیشنهاد می کنم آموزش هش جادی رو ببینید. خیلی ساده و جالبه.

حمایت از گربه‌عصبانی

اگه دوست داشتید کمی از عصبانیت من کم کنید، می تونید برام دونیت کنید.

لینک دونیت به گربه‌عصبانی

ممنون از همه رفقایی که با حمایت‌هاشون به من انگیزه دادند تا بیشتر بنویسم.

بررسی کلی

خب طبق روال همیشگی، یک help از این کتابخونه می گیریم:

کتابخانه hashlib
کتابخانه hashlib

این یکی از ساده ترین کتابخونه هایی هست که توی پایتون داریم. چون تعداد زیادی از توابع درهم سازی (هش) از قبل ساخته شده و ما فقط از اونها استفاده می کنیم. توابع درهم سازی که توسط hashlib پشتیبانی میشه دو مدله:

مدل اول بهشون میگن algorithms_available، این شامل تمام الگوریتم های درهم سازی هست که در مفسر پایتون شما وجود داره. همه توابع در هم سازی توی همه سیستم عامل ها پیاده سازی نشده.

مدل دوم بهشون میگن alogirthms_guaranteed، یعنی الگوریتم هایی که به طور قطعی توسط پایتون پشتیبانی میشه.

توابع

اصلی ترین تابع این کتابخونه تابع new هستش. با استفاده از این تابع، یک hash object جدید با یکی از الگوریتم های هش پشتیبانی شده در پایتون درست می کنیم. پروتوتایپ تابع new این شکلیه:

new(name, data=b”, **kwargs)

همونطور که مشاهده می کنید پاس دادن داده برای هش کردن، در ابتدای کار ضرورتی نداره. یعنی میشه بعدا این دیتا رو بهش بدیم. البته پیشنهاد نمیشه از تابع new استفاده کرد. چرا؟ چون یکسری متدهای دیگه وجود داره که سریعتر از new هستند. این مدت ها عبارتند از:

  • md5()
  • sha1()
  • sha224()
  • sha256()
  • sha384()
  • sha512()
  • blake2b()
  • blake2s()
  • sha3_224
  • sha3_256
  • sha3_384
  • sha3_512
  • shake_128
  • shake_256

به زبان ساده تر بگم، جای اینکه بگیم:

hashlib.new(‘md5’)

بهتره از:

hashlib.md5()

استفاده کنیم. چون سریع تره.

وقتی که با new یا هر کدوم از اون متدهای بالا استفاده می کنیم. به عنوان خروجی به یک hash object می رسیم. هر hash object دارای ۴ تا متد است:

update(data)

برای اضافه کردن داده به داده ی قبلی موجود در هش استفاده میشه. بعد از فراخوانی این متد در واقع تابع اجرای هش یکبار از اول اجرا میشه.

digest()

دایجست داده پاس داده شده رو در قالب Byte Object بر می گردونه.

hexdigest()

مثل متد digest هستش با این تفاوت که خروجی رشته ای در مبنای هگزادسیمال است.

copy()

یک کپی از hash object میگیره.

یک مثال ببینیم:

استفاده از متدهای hash object
استفاده از متدهای hash object

همین ! این کتابخونه چیزه دیگه ای برای بررسی نداره. مگر اینکه بخواید سورس کدشو مطالعه کنید.

کامنت

با توجه به کامنتی که یکی از دوستان لطف کردن و گذاشتن قصد دارم یک برنامه بنویسم. خب اول یه مقدمه بگم. ببینید الان خیلی وقته که نرم افزارها پسورد کاربراشون رو به صورت plain text ذخیره نمی کنن. یعنی اگه پسورد من هست javad نمیان اینو همینطوری به صورت رشته توی دیتابیس ذخیره کنن. چرا؟ چون اگر هکر بتونه به دیتابیس دسترسی پیدا کنه عملا ا طلاعات همه کاربرها فاش میشه. پس به جای اینکار میان هش اون پسورد رو ذخیره می کنن. این موضوع از دو جهت حائز اهمیته: ۱- خود سایت هم نمی دونه پسورد واقعی کاربر چیه و فقط هشش رو می دونه. پس حریم خصوصی تا حد بالایی حفظ میشه. ۲- اگر کسی به دیتابیس نفوذ کنه عملا با یه سری پسورد هش شده طرفه که به این راحتی ها نمی تونه کرکش کنه. البته یه موضوعی هست به نام salt که با اضافه کردن اون به هش ها کار کرک سخت تر هم میشه.

خب اما برنامه چیه؟ یه فایل تکست داریم که توش یوزرنیم و پسورد ۳ کاربر ذخیره شده. البته به صورت هش. حالا ما یوزرنیم و پسورد رو به صورت plain text از کاربر می گیریم و با هش داخل فایل مقایسه می کنیم که پسورد رو درست وارد کرده یا نه. برای این مثال از هش sha256 استفاده می کنم.

خب در قدم اول سه تا پسورد انتخاب کردم: javad111 – bahram222 – virgool333

حالا یه برنامه می نویسم ببینم هش sha256 اینا چی میشه:

محاسبه مقدار هش sha256
محاسبه مقدار هش sha256

خروجی:

خب حالا یه فایل به نام data.txt درست می کنیم و این هش ها رو به همراه یوزرنیم مورد نظرمون توش ذخیره می کنیم. بین یوزرنیم و هش پسورد یه فاصله قرار میدیم که بعدا بتونیم از هم جداشون کنیم:

بدون فوت وقت خیلی سوسکی برنامه اصلی رو می نویسیم:

خب کامنت نزاشتم. به جاش اینجا توضیح می دم. از argv برای خوندن اطلاعات از ورودی استفاده می کنیم. اولش یه سری اعتبارسنجی انجام دادم که کاربری حتما یوزرنیم و پسورد رو موقع اجرای برنامه وارد کرده باشه. بعد فایلی که داده های درست توش هستن رو باز کردم و سطر به سطر خوندم. و مقایسه کردم با چیزی که کاربر وارد کرده. اگه درست باشه یا غلط یه پیغامی متناسب باهاش چاپ می کنه. اجرا کنیم:

تمام ! خوش گذشت…

سخن پایانی

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

** لطفا و حتما من رو دنبال کنید. خوشحال میشم. **

تقدیم به جامعه پایتون ایران… امضا: گربه‌ی عصبانی.

نویسنده مطلب: گربه‌ی عصبانی

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

با هر سطحی از دانش در سریع‌ترین زمان با آموزش گام به گام، سرمایه گذاری را تجربه کن. همین الان میتونی با لینک زیر ثبت نام کنی و ۱۰ درصد تخفیف در کارمزد معاملاتی داشته باشی

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.