python hashlib module

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

زبان پایتون علاوه بر این که زبان آسانی برای یادگیری است، به شما اجازه می دهد برنامه های بسیار كارآمد و با كد های زیادی را ایجاد كنید. این زبان برای رمزنگاری و رمزگشایی ، انجام تست نفوذ ، عملیات امنیتی ، نقش امنیت سایبری و اتوماسیون وظایف عمومی مناسب می باشد.

یادگیری پایتون یکی از بهترین راه ها برای رشد مهارت های شما و پیشرفت شغلی شماست.

نکته
مقاله پیشنهادی: برای آشنایی بیشتر با زبان Python می توانید به دوره آموزش پایتون مراجعه نمایید.

هش کردن چیست؟

هش کردن یک بخش اصلی از اکثر زبان های برنامه نویسی است. همانطور که می دانید مقادیر زیادی از داده ها را می توان در یک بافر ثابت نمایش داد. ساختارهای با ارزش کلیدی از هش ها برای ذخیره منابع استفاده می کنند.

از هش کردن برای ایمن سازی استفاده می شود. هش می تواند قطعی یا غیر قطعی باشد. البته برای رمز نگاری و رمزگشایی به هش قطعی نیاز است. با تغییرات اندکی در داده ها، هش ها می توانند با یکدیگر تفاوت چشمگیری داشته باشند.

الگوریتم های هش کردن توابع ریاضی هستند که داده ها را به مقادیر هش ، کد هش یا هش با طول ثابت تبدیل می کنند. مقدار هش خروجی به معنای واقعی کلمه خلاصه ای از مقدار اصلی است. مهم ترین نکته در مورد مقادیر هش این است که اگر فقط مقادیر خلاصه هش را داشته باشیم،  بازیابی اطلاعات ورودی اصلی غیرممکن می شود.

در این مقاله رایج ترین روش های هک و امنیت و رمزنگاری در پایتون (python) بررسی می شود.

روشهای هک و امنیت با پایتون (python)

1) Built-In Hashing  ( هش کردن داخلی )

زبان پایتون تابع built-in را به شکل زیر شامل می شود.

>>> hash("test")
2314058222102390712

این کد در پایتون 2.7 اجرا شده است و کد زیر در پایتون 3.7.

>>> hash("test")
5946494221830395164

نتایج این دو کد متفاوت است و برای هر فراخوان جدیدی از پایتون نیز متفاوت خواهد بود. پایتون هرگز تضمین نکرده است که ()hash در آن قطعی می باشد.

در ورژن پایتون 2.x، هش کردن داخلی بیشتر اوقات تعیین کننده و قطعی است، البته نه همیشه.

به همین علت  Python 3.x برای بهبود امنیت، قابلیت تصادفی بودن را به ()hash  اضافه کرد. برای مثال مرتب سازی پیش فرض فرهنگ لغت ها ، مجموعه ها و لیست ها با هش کردن داخلی پشتیبانی می شود.

 

2) Checksums

Checksum برای تأیید اعتبار داده ها در یک فایل استفاده می شود. پرونده های ZIP برای اطمینان از خراب نبودن فایل هنگام اکسترکت شدن ،  از checksums استفاده می کنند. برخلاف هش کردن داخلی پایتون ، این نوع هش، قطعی است و داده های یکسان هر بار نتیجه یکسانی را برمی گردانند.

 

3) Secure Hashing ( هش کردن امن )

پروسه هش کردن امن به مرور تکامل یافته اند. از MD5 به SHA1 تا SHA256 به  SHA512 در پایتون

با تکامل هر کدام از این هش های امن، امنیت بهبود داده شده و خطر برخورد و تصادم با هش را کاهش می دهد.

تصادم زمانی است که دو آرایه مختلف داده در یک هش یکسان حل و فصل شوند.

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

برای مثال ملاحظه کنید که دو هش MD5 بعد از تغییر یک کاراکتر چقدر متفاوت هستند.

>>> import hashlib
>>> hashlib.md5(b"test1").hexdigest()
'5a105e8b9d40e1329780d62ea2265d8a'
>>> hashlib.md5(b"test2").hexdigest()
'ad0234829205b9033196ba818f7a872b'

sha256 در پایتون چیست؟

توابع هش نوعی تابع رمز گذار هستند که دادهای باینری را را با استفاده از عملیات های پیچیده ریاضی، به طریق یک سو تغییر می دهد. sha256 python یک زیر شاخه از SHA 2 است که برای بروز رسانی SHA 1 منتشر شد. هش SHA 1 دچار باگ امنیتی در امضای دیجیتال شد. در همین راستا NSA (آژانس امنیت ملی) برای حل این مشکل sha256 را منتشر نمود.

حال، سوال پیش می آید که:

 استفاده از الگوریتم های هش کردن چه فایده ای دارد؟

استفاده از الگوریتم های هش کردن چه فایده ای دارد؟

 چرا تاکید بر رمزنگاری و رمزگشایی می شود؟

خوب ، با اینکه رمزنگاری برای محافظت از داده ها (محرمانه بودن داده) مهم است ، اما گاهی اوقات این نیز مهم است که بتوانید ثابت کنید کسی به داده ای که ارسال می کنید دست نزده و تغییری ایجاد نکرده است. با استفاده از هش کردن، شما می توانید تشخیص دهید که کدام یک از فایل ها از زمان ایجاد تغییر نکرده اند (یکپارچگی داده ها).

مثال های زیادی برای استفاده از هش کردن برای هک و امنیت با پایتون وجود دارد. برخی از مثال ها عبارتند از: امضاهای دیجیتالی ، رمزنگاری کلید عمومی ، تأیید اعتبار پیام ، محافظت از رمز عبور و بسیاری از پروتکل های رمزنگاری دیگر.

در این آموزش ، ما از روش هش کردن built-in در hashlib برای رمزنگاری استفاده خواهیم کرد .

شروع می کنیم:

import hashlib



# encode it to bytes using UTF-8 encoding

message = "Some text to hash".encode()

ما می خواهیم از الگوریتم های مختلف هش در این رشته کد استفاده کنیم ، با MD5 شروع می کنیم:

# hash with MD5 (not recommended)

print("MD5:", hashlib.md5(message).hexdigest())

خروجی:

MD5: 3eecc85e6440899b28a9ea6d8369f01c

MD5 اکنون بسیار منسوخ شده است و شما هرگز نباید از آن استفاده کنید. زیرا در برابر برخورد و تصادم مقاوم نیست.

 

حال می خواهیم SHA-2 را امتحان کنیم:

# hash with SHA-2 (SHA-256 & SHA-512)

print("SHA-256:", hashlib.sha256(message).hexdigest())



print("SHA-512:", hashlib.sha512(message).hexdigest())

خروجی sha256 python:

SHA-256: 7a86e0e93e6aa6cf49f19368ca7242e24640a988ac8e5508dfcede39fa53faa2

SHA-512: 96fa772f72678c85bbd5d23b66d51d50f8f9824a0aba0ded624ab61fe8b602bf4e3611075fe13595d3e74c63c59f7d79241acc97888e9a7a5c791159c85c3ccd

SHA-2 یک خانواده دارای 4 عملکرد هش است SHA 224  ، SHA 256 ، SHA 384  و  SHA 512 ، همچنین می توانید از() hashlib.sha224 و   () hashlib.sha-384  نیز استفاده کنید. با این حال ،  SHA-256 و SHA-512 بیشتر استفاده می شود.

SHA-2 الگوریتم هش امن 2 نامیده می شود و دلیل آن این است که SHA-2 جانشین  SHA-1 است که قدیمی است و شکستن آن آسان است . انگیزه SHA-2 ایجاد هش های طولانی تر است که منجر به امنیت بالاتر می شود.

اگرچه امروزه هنوز از SHA-2 استفاده می شود این است که بسیاری بر این باورند كه حملات به  SHA-2  زمان بر است. محققان به دلیل شباهت آن به SHA-1 نگران امنیت طولانی مدت آن هستند.

در نتیجه ،  SHA-3 توسط NIST به عنوان یک طرح پشتیبان معرفی شده است که یک عملکرد اسفنجی است و کاملاً متفاوت از SHA-2 و SHA-1 است.

اجازه دهید آن را در پایتون ببینیم:

# hash with SHA-3

print("SHA-3-256:", hashlib.sha3_256(message).hexdigest())



print("SHA-3-512:", hashlib.sha3_512(message).hexdigest())

خروجی:

SHA-3-256: d7007c1cd52f8168f22fa25ef011a5b3644bcb437efa46de34761d3340187609

SHA-3-512: de6b4c8f7d4fd608987c123122bcc63081372d09b4bc14955bfc828335dec1246b5c6633c5b1c87d2ad2b777d713d7777819263e7ad675a3743bf2a35bc699d0

بعید است که SHA-3 به این زودی شکسته شود. در حقیقت ، صدها رمزنگار ماهر موفق به شکستن SHA-3 نشده اند.

منظور ما از امنیت در الگوریتم های هش چیست؟

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

انگیزه های کمی برای به روزرسانی به SHA-3 وجود دارد، زیرا SHA-2 هنوز امن است و از آنجا که سرعت نیز مسئله مهمی است ،  SHA-3 سریعتر از SHA-2 نیست.

اگر بخواهیم از الگوریتمی استفاده کنیم که دو الگوریتم بالا را در بر بگیرد، پاسخ در BLAKE2 نهفته است:

# hash with BLAKE2

# 256-bit BLAKE2 (or BLAKE2s)

print("BLAKE2c:", hashlib.blake2s(message).hexdigest())

# 512-bit BLAKE2 (or BLAKE2b)

print("BLAKE2b:", hashlib.blake2b(message).hexdigest())

خروجی:

BLAKE2c: 6889074426b5454d751547cd33ca4c64cd693f86ce69be5c951223f3af845786

BLAKE2b: 13e2ca8f6a282f27b2022dde683490b1085b3e16a98ee77b44b25bc84a0366afe8d70a4aa47dd10e064f1f772573513d64d56e5ef646fb935c040b32f67e5ab2

هش های BLAKE2 سریعتر از SHA-1 ، SHA-2 ، SHA-3  و حتی MD5 هستند. این الگوریتم برای استفاده در پردازنده های مدرن مناسب است که از محاسبات موازی در سیستم های چند هسته ای پشتیبانی می کند.

BLAKE2 به طور گسترده ای مورد استفاده قرار می گیرد و در کتابخانه های رمزنگاری اصلی مانند OpenSSL ، hashlib و Sodium و موارد دیگر ادغام شده است.