-
چهارشنبه, ۱۶ بهمن ۱۳۹۸، ۰۷:۴۳ ب.ظ
-
۳۸۰۷
نوشتن اسکریپت کرکر هش های sha256 در پایتون
درود به همه .
امروز یه اسکپریت فوق العاده باحال داریم .
یه توضیح بدیم که هش های sha256 چیه . اگه رمز نگاری کار کرده باشین خب میدونین هش ها چی هستن . هش کلا یه روش یا یه فرمول یه الگوریتم یا ... هرچی که اسمشو میزارید هستش برای تبدیل یک متن به یه چیز دیگه . (یه کد دیگه در مبنای ۱۶ معمولا ) . یعنی مثلا ما کلمه ی Hossein رو میدیم به یه دستگاه هش و برامون Hossein رو تبدیل میکنه به 5646132456132ABCDC1 . این مثال بودا . خب همونطور که دیدید یه چیزی رو به چیزی دیگه تبدیل میکنه . البته وقتی متن اولیه تبدیل میشه به متن پیچیده دومی باید بدونین همیشه اندازه ی متن دومی ثابته . یعنی چی ؟ مثلا اگه من Hossein رو هش کنم خب متنی که برام ساخته میشه که حاصل تبدیل حسین به یه چیز دیگس همیشه مثلا سایزش ۱۶ بیته . بعد اگه مثلا Ali رو هم باهمون الگوریتم هش کنم بازم باید ۱۶ بیت باشه . منظور از اینکه اندازه ثابته اینه . البته اینکه چند بیت باشه بستگی داره با چه الگوریتمی هش کنید . شاید یه الگوریتم هشینگ متنای ۱۲۰ بیتی تولید کنه یا جورای دیگه . ... .
خب حالا با هش آشنا شدین اما حالا sha256 چیه .؟ sha256 درواقع یک الگوریتم هش کردن هست برای رمزنگاری . رمز نگاری رو قبلا فک میکنم گفتیم . در این الگوریتم ما یه متن بهش میدیم (متن اولیه) بعد این با الگوریتمی که داره متنمون رو تبدیل میکنه به یه چیز چرتوپرت مثل این ABCABCAB12313244123ADC (متن دوم) . حالا همونطور که گفتیم سایز متن دومی همیشه ثابته . و اینکه این الگوریتم یه جوریه که هر حرف ، کلمه یا متن دقیقا یک هش (همون متن دومی) منحصر به فرد داره . یعنی تقریبا غیر ممکنه دوتا کلمه پیدا کنید که هش اونا مثل هم باشه .
یه نکته باید بدونین اونم اینه که رسیدن از متن اولی یعنی متن عادی به متن دومی که هش شده خب کار راحتیه دیگه الگوریتم خودش انجام میده ولی رسیدن از متن دومی یعنی متن هش به متن اولی غیر ممکنه . مثلا ببینید ما Hossein رو میتونیم با یه الگوریتم مثلا به 454AB4F5533ACD تبدیل کنیم ولی به هیچ وجه نمیتونیم از 454AB4F5533ACD به Hossein برسیم . برا همین اینا امنیتشون بالاس .
خب دیگه تحقیق بیشتر در مورد اینا رو میزارم بر عهده خودتون .
اما ما میخوایم یه اسکریپتی بنویسیم که یک هش الگوریتم sha256 رو کرک کنیم و به متن اصلی برسیم یعنی از دومی به اولی برسیم خودمونی بگم هش رو کرک کنیم .
ولی خب گفتیم اینکار غیر ممکنه . پس باید چیکار کنیم . ؟ ما از روشی به نام حمله دیکشنری (Dictionary Attack) برای کرک کردن استفاده میکنیم که این روش بر پایه ی آزمون و خطاس . ما اول باید یک لیستی از کلماتی که ممکن است متن اولیه ی هش باشند را تهیه کنیم و در فایلی بنویسیم . به این فایل میگن دیکشنری . هر تعدادی میتونه باشه از یکی گرفته تا صد ها هزار تا و بیشتر .... خب بعد ما باید یه اسکریپت بنویسیم که آدرس این دیکشنری رو بهش بدیم و هشی که میخوایم کرک کنیم رو هم بهش بدیم . بعد باید بیاد تک تک کلمات توی دیکشنری رو از طریق همان الگوریتم هش (در اینجا sha256) هش کنه و هر کدومش با همین هشی که میخوایم کرک کنیم برابر شد یعنی متن اولیه ی این هش همین کلمه بوده .
خب امیدوارم ساده توضیح داده باشم :) .
بریم سراغ نوشتن اسکریپت . اول یه فایل پایتونی ایجاد کنین و سورس کد زیر رو بریزین داخلش :
import hashlib
def checkHash(hash,word): print(word) obj = hashlib.sha256() obj.update(word.encode()) h = obj.hexdigest() if h == hash: return True return False
dic = input("Dictionary : ") hash = input("hash : ")
f = open(dic,"r") words = f.readlines()
for i in range(len(words)): words[i] = words[i].strip("\n") state = False correct = "" for word in words: if checkHash(hash,word): state = True correct = word break
if state: print ("*" * 30) print ("Hash Cracaked !") print ("{} : {}".format(hash,correct)) exit() else: print ("*" * 30) print ("Sorry ! . I Can't Crack Your Hash :(") exit()
خب بریم یه توضیح :
اول که کتابخانه ی hashlib رو وارد برنامه کردیم که برای کار با هش ها هست . ما برای تبدیل یک متن به هش اون متن ازش استفاده میکنیم .
بعد یه تابع داریم که چک میکنه هش یه کلمه با هشی که میخوایم کرک کنیم یکی میشه یانه . یعنی اول کلمه رو هش میکنه بعد میبینه هش کلمه با هشی که میخوایم کرک کنیم یکی شد یا نه
بعد دوتا ورودی از کاربر میگیریم . اولی در واقع آدرس فایل دیکشنری هست . و دومی هم هش هست که میخوایم کرک کنیم .
بعد از وارد کردن این دوتا ورودی فایل دیکشنری خونده میشه و کارای مورد نیاز روش انجام میشه و اوکی میشه . بعد کلمات دیکشنری داده میشه به تابعی که اون اول تعریف کردیم تا هش اونا رو بدست بیاره و با هشی که میخوایم کرک کنیم مقایسه کنه . اگه هش دوتاش یکی شد یعنی کلمه ی اصلی پیدا شده . بعد دیگه کارشو متوقف میکنه و یه متنیو چاپ میکنه که هش کرک شد و متن اصلی هش رو مینویسه .
اگه هم که اصلا هش کرک نشد یعنی کلمه ی اصلی هش داخل دیکشنری نبود که یه متن دیگه چاپ میکنه که هش کرک نشد متاسفانه .
بریم سراغ تست کردن . با این برنامه میخوام هش mrpython که معادل :
ad69ee90c4186b9d203cf897d5275f7ff96c0195d647da6a0afa3c572a5a5810
هست رو کرک کنیم.
برای اینکار یه دیکشنری باید ایجاد کنیم من یه سری کلمه مینویسم تو یه فایلی به نام dict.txt . به شکل زیر :
Ali
Hossein
Mohsen
Mohammad
mrpython
google
aparat
salam
khobi?
chetori?
chekhabar
baba base dige
خب همونطور که میبینید کلمه ی اصلی هش یعنی mrpython هم داخل فایل هست .
خب الان دیکشنری آمادس فقط باید برنامه رو اجرا کنیم و اول آدرس دیکشنری و بعد هش که میخوایم کرک کنیمو بهش بدیم . بعد که اینارو دادیم بهش اینتر میزنیم و چون متن اصلی هش داخل دیکشنری هست هش رو میتونه کرک کنه و کرک میکنه . در تصویر زیر ببینید :
خب میبینید که اسکریپت به درستی کار کرد
این اسکریپت رو میتونید از گیت هاب من دانلود کنید . اگه ایده ای برای بهبود این اسکریپت دارید در گیت هاب مشارکت کنید .
https://github.com/mrpythonblog/sha256-cracker.git
یا حق
Telegram Channel : @mrpythonblog