5 months, 2 weeks ago

مقدمه


 یکی از پرکاربردترین موارد استفاده از رمزنگاري، مفهوم Hashing است. Hash در حقیقت Footprint یک فایل است
که میتواند در شرایط مختلف مورد استفاده قرار گیرد. در این مطلب به بررسی Hashing در زبان برنامهنویسی پایتون پرداخته و
دو پروتکل شناخته شده در این حوزه را معرفی خواهیم کرد.

معرفی


همانطور که اشاره شد، Hash به معناي Footprint یک فایل است. این مفهوم بدین معنااست که هر فایل، یک Hash مختص به
خود را داراست و با کوچکترین تغییر در فایل (حتی یک بیت) خروجی Hash متفاوت خواهد بود. بعبارت دیگر اگر Hash 2 فایل
یکسان باشد، آن دو فایل یکسان خواهند بود.
در مطلب "معرفی رمزنگاري" که پیش از این ارایه شده است، در مورد رمزنگاري و اهداف آن صحبت شده بود. بطور کلی
Cryptography براي دستیابی به اهداف زیر بکار گرفته میشود:
 Integrity یا یکپارچگی
 Authentication یا احراز هویت
 Confidentiality یا محرمانگی
هریک از پارامترهاي فوق به نحوي توسط رمزنگاري فراهم میشود. 
در این بین Integrity یا یکپارچگی ویژگی مهمی است که توسط Hashing فراهم میشود. Hash تابعی است که مقداري را
بعنوان ورودي دریافت کرده و در خروجی یک مقدار ثابت را ارایه میدهد. ورودي تابع هر میزان که باشد خروجی آن یک مقدار
Fixed یا ثابت خواهد بود.
Collision :تلاش براي یافتن دو رشته ورودي متفاوت است که خروجی یکسان داشته باشد. در نتیجه ممکن است دو رشته ورودي
یافت شود که متفاوت بوده اما خروجی Hash آنها یکسان باشد. بدلیل اینکه توابع Hash داراي ورودي بینهایت بوده اما خروجی
ثابت دارند این احتمال وجود دارد که 2 ورودي متفاوت (هرچقدر اندازه ورودي بزرگتر، احتمال Collision بیشتر)، خروجی یکسان
داشته باشند. به این مفهوم Collision میگویند. امروزه و با توجه به افزایش قدرت در پردازش، تواناي Force Brute و رسیدن
به Collision Hashing نیز در مقایسه با قبل افزایش یافته است.
Effect Avalanche :با تغییر در هر بیت، این شانس وجود دارد که 50 درصد تغییر در خروجی وجود داشته باشد. البته این
مطلب لزوما به معناي تغییر نیمی از خروجی به ازي هر بیت نیست بلکه بدین معناست که با کوچکترین تغییر، خروجی شاهد تغییر
به میزان بالا خواهد بود. این عبارت دقیقا تعریف Effect Avalanche است.
Function Way-One :تابع Hash یک تابع یک طرفه است. بدین معنا که با داشتن Hash از یک فایل نمیتوانید فایل را بدست
آورید. این تابع تنها با ورودي یک فایل، یک خروجی ثابت ارایه میدهد. مسیر برگشت در آن نیز غیرممکن خواهد بود.
بعد از بررسی تعاریف اولیه Hashing بد نیست با دو تابع کاربردي Hash نیز آشنا شده و ویژگیها و خصایص آن را همراه با کاربرد
آن در برنامه نویسی پایتون بررسی نماییم.

Message Digest 5
MD5 یکی از عمومیترین توابع Hash است که در دنیاي کامپیوتر مورد استفاده قرار میگیرد. این Hash در سال 1991 و توسط
Rivest Ronald معرفی و جایگزین MD4 شد. این Hash سریع در محاسبه و به اندازه کافی مطمئن است که بتواند کاربردهاي
عمومی و روزمره را پوشش دهد. هرچند با یافتن Collision در آن، امنیت آن کامل نیست. یعنی در MD5 این احتمال وجود دارد
که دو Hash یکسان، خروجی دو فایل یکسان نباشد. (اما معمولا اینطور است و 2 فایل یکسان خواهند بود.) با وجود Collision و
ضعفهاي کشف شده در MD5 ،توصیه میگردد که در سیستمهاي با اهمیت بالا از این تابع استفاده نشود.
MD5 داراي خروجی 128 بیتی است. بدین معنا که با هر ورودي و به هر میزان، خروجی برابر با مقدار ثابت 128 بیت خواهد بود.
در خصوص الگوریتم MD5 و مراحل اجراي آن در مطلبی مجزا به آن خواهیم پرداخت.
استفاده از MD5 در پایتون ساده است. براي این منظور کافی است از ماژول hashlib به شکل زیر (یکی از 2 روش) استفاده کنید: 

 

  1. import hashlib
  2. ()hashlib.new('md5','hello'.encode('ascci')).hexdigest

 


SHA یکی دیگر از انواع توابع Hash است که در سه رده SHA1 ،SHA2 و SHA3 ارایه شده است. Algorithm Hash Secure
خروجی SHA1 160 بیت است و همانند MD5 داراي Collision بوده لذا از امنیت کامل برخوردار نخواهد بود. جایگزین SHA1
با نام SHA2 از امنیت کامل برخوردار بوده و تاکنون Collisionاي براي آن شناخته نشده است. خروجی SHA2 و SHA3 عموما
256 یا 512 بیتی است 

سید طه آیت اللهی

نظرات