امیرحسین امانی
امیرحسین امانی
خواندن ۶ دقیقه·۱۰ روز پیش

هک پسورد از طریق sha256 در پایتون


یه پروژه با آموزش چند گانه ، کار با کتابخانه hashlib ، کار با csv و دیکشنری ...
یه پروژه با آموزش چند گانه ، کار با کتابخانه hashlib ، کار با csv و دیکشنری ...


سلام . با یک حل مساله پایتون درخدمتتون هستم . چرا مسله حل میکنیم ؟ چون با کدهای جدید اشنا شیم ، با الگوریتم های مختلف اشنا شیم و حتی با ارور های مختلف آشنا شیم ! و خلاصه بیشتر برنامه نویسی رو کشف کنیم ...

توجه : برای اینکه بهتر یاد بگیرید قطعه کدی رو تا زمانی که مطمئن نشدید فهمیدین کپی نکنید!

هش کردن یک فرایند یک طرف است ، شما میتونید با داشتن پسورد به هش شده اون برسید ولی نمیتونید با داشتین هش شده رمز به اون رمز برسید . یک مثال میزنم که جا بیفته ، شما میتونید با گوجه(رمز)،رب(رمز هش شده) درست کنید ولی نمی تونید با رب(رمز هش شده) گوجه(رمز) درست کنید . اما راهی برای دور زدن این قضیه وجود داره : ما یک شیشه مربا داریم که نمیدونیم توش چه مربایی هست ، تا حالا هم مزه هیچ مربایی رو نچشیدیم تا بدونیم چه مزه ایه و میخوایم بدونیم تو اون شیشه چه مربایی هست ؛ حالا ما سیب و پرتقال و انار و موز و هویج و بالگ و توت فرنگی داریم . با تمام اینا مربا درست میکنیم ( ولی انصافا با موز نمیشه مربا درست کرد! ) بعد مزه هر کدوم از مربا ها رو با مزه مربایی که نمیدونیم چیه مقایسه میکنیم و هر کدوم از مربا ها که با شیشه مربا هم مزه بود یعنی مربا با اون میوه درست شده !! جواب پیدا شد ، مربا انار!!!!!!!!!!!!!!!!

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

تعریف پروژه :

ما یه فایل csv. داریم که در اون نام کاربر و پسورد هش شده نوشته شده . ما میخوایم بفهمیم که رمز هر کاربر چی هست . چیزایی که میدونیم اینه که رمز هر کاربر عددی بین 1-9999 هست و میدونیم که با الگوریتم هش sha256 پسورد ها هش شدند.

اینم فایل csv. که نام کاربر با رمز هش شده اونها نوشته شده :

iliya,cfa8624c2d1e3c8c89316808b45ce942770e5ef9cd845dfd74baf4a616aa6d3a arshia,03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4 mahsen,888df25ae35772424a560c7152a1de794440e0ea5cfee62828333a456a506e05 ralf,6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b jafar,b22eb34537f6f6753da6e0dc05713be0ccc35ef12dae0f6bf19b5206d373af33
توجه کنید که در فایل csv. نباید خط خالی وجود داشته باشه وگرنه برنامه با مشکل مواجه میشه

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

https://virgool.io/p/zqktv4cbkitj/%D9%81%D8%B1%D8%A7%DB%8C%D9%86%D8%AF%DB%8C%DA%A9%D8%B7%D8%B1%D9%81%D9%87%D9%87%D8%B4%DA%A9%D8%B1%D8%AF%D9%86

1- چیزایی که نیاز به ایمپورت (import) شدن دارند رو مینویسیم :

from csv import reader from hashlib import sha256

اول از کتابخونه reader ، csv رو ایمورپ میکنیم چون برای کار با فایل هایی با فرمت csv. و خوندن (reader) اونها بهش بهش نیاز هست ، بعد از کتابخونه sha256 ، hashlib رو ایمپورت می کنیم .

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

2- یه دیکشنری خالی تعریف میکنیم :

hash_password_to_password = {}

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

3-ساخت اعداد 1-9999 و هش کردن اونها با استفاده از الگوریتم هش "sha256" :

for password in range(1000,10000):

اول یک حلقه فور(for) می نویسیم و با استفاده از تابع (range) اعداد یک تا 9999 رو درست بکنه و خب این رو هم میدونیم که باید یک دونه بیشتر از اونی که میخوایم عدد ایجاد بکنیم در رنج بنویسیم ، مثلا اگر مخوایم اعداد یک تا پنج رو چاپ بکنه با بنویسیم (range(1,6.

hashing_number = sha256(b'%i'% password).hexdigest()

مثل ریاضی انجام عملیات از داخلی ترین پرانتز اغاز میشه . اینجا داخلی ترین پرانتر (b'%i'% password)هست " "b متن رو تبدیل به بایت(byte) تبدیل میکنه ، i% به مفسر میگه که من بعدا بهت یک عدد(int) میدم ، بعد بیرون از علامت های نقل قول یک درصد خالی میزاریم و مفسر میفهمه که الان میخواد بهش عددی رو بده که گفته بود ، عدد که از 1-9999 باشه رو ریختیم تو متغیری به نام password . password یک عدد رو در خودش ذخیره میکنه بعد که کارش در یک مرحله از فور(for)تموم شد مقداری که به password منتسب شده پاک میشه و عدد بعدی جای اون رو میگیره .

در مرحله بعد متن یا عددی که به بایت تبدیل کرده بودیم با استفاده از الگوریتم sha256 هش میشن. سپس یک نقطه و بعدش ()hexdigest مینویسیم تا فرایند هش کامل بشه.

sha256(b'%i'% 1399) # <sha256 HASH object @ 0x00000144EEABFC10> 0x00000144EEABFC10 # 1395573652496 sha256(b'%i'% 1399).hexdigest() #'3485da2e4aaa4c692d04e570406af48b512f13137ab9e57718753a7a9f7b6e1c' # البته خیلی نیاز به دونستن نداره صرفا برای افرادی که مثل خودم کنجکاون نوشتم

4-وارد کردن اعداد و اعداد هش شده به دیکشنری :

hash_password_to_password[hashing_number] = password

در این مرحله اعداد هش شده به عنوان کلید(keys) و خودِ اعداد مقدار (values) اون کلید ها قرار میگیرند و به دیکشنری hash_password_to_password اضافه میشوند . یعنی اگر یک keys(در اینجا اعداد هش شده) رو صدا بزنیم , values (در اینجا اعدادی که هش میشن) میگن : بله !

5-باز کردن فایل csv. و خواندن آن :

with open('D:/iliya/users password.csv') as f: psswords_singer = reader(f)

فایل رو باز میکنیم و اون رو f نام گذاری میکنیم ، خط بعد متغیری بنام psswords_singer تعریف میکینم که فایل باز شده را میخواند .

for row in psswords_singer: name_users = row[0]

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

for key in row[1:]: print(name_users,':',hash_password_to_password[key])

حال پسورد هش شده هر کاربر را ([:row[1) به عنوان کلید در نظر گرفته و در دیکشنری ای که اول تعریف کردیم به دنبال آن پسورد هش شده میگردد و در آخر نام کاربر به همراه رمز عبور آن چاپ میشود !!

کد یکجا این پروژه :

from csv import reader from hashlib import sha256 hash_password_to_password = {} for password in range(1,10000): hashing_number = sha256(b'%i'% password).hexdigest() hash_password_to_password[hashing_number] = password with open('D:/iliya/users password.csv') as f: psswords_singer = reader(f) for row in psswords_singer: name_users = row[0] for key in row[1:]: print(name_users,':',hash_password_to_password[key])

حالا فایل csv. بالا رو بر دارید و در کامپیوتر خودتون ذخیره کنید ، سپس آدرس فایل رو به محلی که فایل در اون ذخیره شده تغییر بدید و برنامه رو اجرا کنید ...

امیدوارم کمکتون کرده باشم . با نظرات و لایک هاتون ممیتونید از من حمایت کنید ‍، و با دنبال کردن من میتونید از جدید ترین پست های من در زمینه برنامه نویسی پایتون مطلع شوید .



تابع هشhash
سلام به همه رفقا من قصد دارم تجربیات چند سال گذشتم رو در خدمت شما بزارم #با_هم_پیشرفت_کنیم
شاید از این پست‌ها خوشتان بیاید