سلام امیدوارم حالتون خوب باشه
در این پست قراره در مورد یکی از مهم ترین مسائل امنیتی بحث کنیم
همونطور که میدونید در انتهای مسیر هک و امنیت به چالشی به نام کدهای هش شده میرسیم
یعنی کلی تلاش میکنی ، از جونت مایه میزاری تا یکی رو هک کنی ولی آخرش اون بی معرفت بجای اینکه رمز عبورش رو بهت بده یسری کدهای عجیب غریب تحویل میگیری :( :|
خوب بریم سر اصل مطلب :
هش چیه؟
هش یه عملیات ریاضی یک طرفه است
یعنی رمز شما به کمک یه فرمولی تبدیل به یسری کارکتر ها و اعداد میشه که برای انسان قابل درک نیست!
این عملیات یک طرفه است یعنی کد شما تبدیل به هش Hash یا دایجست digest میشه ولی هش شما تبدیل به رمز اولیه نمیشه!
هش ها نمونه های مختلفی دارن
تو برنامه نویسی برای امنیت کارمون ما میتونیم خودمون هم این هش هارو طراحی کنیم
ولی بیشتر از هش های استانداری مثل :
MD5
FC97CC2B7961ED4492CA1A5AA7E03860
SHA1
6320A7DCE7641107EDD476F6C6F95088A97D2972
SHA256
0FD056DBBF9B231616689574C700A5E6DE0A0380FE53434B85F94C627648630B
و .... استفاده میشه که دایجست های بالا همه برای کلمه ی Virus32 هستن.
تولید این کدها برای یک برنامه نویس کار دشواری نخواهد بود
ولی شکستن این کدها تقریبا غیرممکنه!
همونطور که در ابتدا گفتم این یک عملیات یک طرفه است و نمیشه از این کدها به رمز اصلی برگردیم
پس تنها راهکار کرک کردن این کدها هستش
یعنی سایت هایی هم که با عنوان هش کیلر Hash Killer فعالیت میکنن رمز شمارو براتون هک نمیکنن
اونها فقط سعی میکنن کرکش کنن که این به این معنیه که اگه رمز مورد نظر تو لیست شون باشه میتونن کد رو برات کرک کنن درغیر این صورت هیچ شانسی ندارین
این مشکل برای ما ایرانی ها و یا غیر انگلیسی زبان ها بیشتر خواهد بود چون رمز هایی که ما هک میکنیم برگرفته از فارسی هستن اکثرشون ؛ مثلا رمز ساده ی 32akbar16 رو نمیشه تو هر سایت هش کیلری کرک کرد ولی رمز 7575john2016 رو خیلی راحت میشه کرک کرد
حالا چاره کار چیه؟
کاری که من انجام دادم (مثل بقیه دوستان) اینه که یه برنامه برای خودم ساختم که کدهامو تبدیل به هش میکنه
از همین روش استفاده کردم و یه دیتابیس طراحی کردم و هرچی پسوورد لیست داشتم رو تبدیل به هش کردم و تو دیتابیسم ذخیره میکنم
این دیتابیس هرچقد بزرگتر باشه برای من بهتره پس هر از گاهی آپدیتش میکنم و لیست جدید که به دستم رسید بهش اضافه میکنم
و یا وقتی یکی رو هک میکنی میتونیم تقریبا حدس بزنیم رمزش چی میتونه باشه
مثلا با اسمش و اعداد یه لیست درست میکنیم
و یا با سال تولدش و خلاصه هرچی که به ذهنت میرسه یه لیست درست میکنیم و به بانکمون اضافه میکنیم و بعد خیلی راحت میتونیم هش مون رو کرک کنیم!
حالا بریم سراغ ساختن این برنامه :
ببینید من خیلی وقته به شما و دوستای نزدیکم میگم که برنامه نویسی رو شروع کنید.
چون اول و آخر این مسیر حداقل یک زبان رو باید بلد باشید
این برنامه رو هم میشه با هر زبانی نوشت ولی من اینجا با سی شارپ آموزش میدم
دیگه مثل قدیما از صفر شروع نمیکنم
اگه هنوزم تو شروع کار و ایجاد پروژه مشکل داشتین پست های قبلی رو مطالعه کنید اونجا با رسم شکل توضیح دادم
برنامه ای که باید بسازید فرم اصلیش یه چیزی شبیه فرم زیر هستش
در این آموزش دو قسمت اولی که علامت زدم رو یاد میگیریم یعنی Make و Kill
ابتدا یه فرم دیگه به پروژه اضافه کنید به اسم Make و به شکلی شبیه فرم زیر درستش کنید
طراحی فرم فقط سلیقه است و میتونید هرجوری که دلتون میخواد درستش کنید
درکل چیزی که لازمه دوتا تکست باکس یکی معمولی یکی مولتی لاین و ...
حالا بریم سراغ کد نویسی :
من اینجا کد نویسی MD5 رو قرار میدم بقیه رو فکر کنم خودتون خیلی راحت میتونید انجامش بدین چون یکم دقت کنید خیلی ساده است فقط یه کلمه رو باید عوض کنید که اگه بازم نتونستید توضیح میدم!
به قسمت کد نویسی صفحه تون برین و کتابخونه ی زیر رو اضافه کنید
using System.Security.Cryptography;
و کد زیر رو که میتونید برای یک متد یا یک دکمه یا ... هرجایی استفاده کنید
void md5()
{
if (textBox1.Text != "")
{
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.ASCII.GetBytes(textBox1.Text);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("X2"));
}
textBox2.Text = sb.ToString();
}
}
else
{
textBox2.Text = "";
}
}
من اینجا توی متد md5 کدهامو تعریف کردم که رمز در تکست باکس 1 وارد میشه و در تکست باکس 2 هم مقدار دایجست یا هش رو نمایش میده که با دستور شرطی درون اونت تکست چنجش قرار دادم
کدهای فرم make همین قدر خواهد بود
خودتون توی کدها عبارت md5 رو به sha1 یا هرچیز دیگه تغییر بدین تا بقیه استاندارد هارو بسازین و ...
بریم سراغ فرم کیلر kill
تو این فرم دو تا عملیات مهمی که انجام میدیم
یکی اضافه کردن پسوورد لیست به بانک اطلاعاتیدومی پیدا کردن هش مورد نظر از دیتابیس (عملیات جستجو)
شکل کلی فرم میتونه به صورت زیر باشه
کدهای جستجو رو تو این صفحه تعریف مکنیم که به شکل زیر میشه
ابتدا یه کانکشن عمومی بالای کدها تعریف کردم
(بانک من اس کیو لایت هست ولی شما میتونید از هر بانکی استفاده کنید)
public SQLiteConnection cco = new SQLiteConnection(@"data source=|DataDirectory|hashdata.db; Version=3; password=****;");
و حالا تکه کد جستجو به شکل زیر میشه
cco.Open();
SQLiteCommand da = new SQLiteCommand("select * from md5 where hash=@ab", cco);
da.CommandType = CommandType.Text;
da.Parameters.AddWithValue("@ab", textBox1.Text);
SQLiteDataReader rdr = da.ExecuteReader();
if (rdr.Read())
{
textBox2.Text = rdr["pass"].ToString();
}
else
{
textBox2.Text = "";
}
cco.Close();
rdr.Close();
من تو دیتابیسم یه کلومن به اسم md5 دارم که توش دو تا ستون hash,pass داره
این کد هم هش موجود در تکست باکس 1 رو جستجو میکنه و نتیجه رو در صورت وجود که همون پسوورد هست رو در تکست باکس 2 نمایش میده
حالا بریم قسمت بعدی
اضافه کردن اطلاعات به دیتابیس
یه فرم به شکل زیر لازم داریم
کدهای دکمه جستجو
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
if (theDialog.ShowDialog() == DialogResult.OK)
{
textBox1.Text = theDialog.SafeFileName.ToString();
string line;
var file = new System.IO.StreamReader(theDialog.FileName.ToString());
while ((line = file.ReadLine()) != null)
{
listBox1.Items.Add(line);
label3.Text = listBox1.Items.Count.ToString();
}
}
کدهای دکمه استارت
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.ASCII.GetBytes(itemo);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int m = 0; m < hashBytes.Length; m++)
{
sb.Append(hashBytes[m].ToString("X2"));
}
md5o = sb.ToString();
cco.Close();
cco.Open();
SQLiteCommand da = new SQLiteCommand("select * from md5 where hash=@ab", cco);
da.CommandType = CommandType.Text;
da.Parameters.AddWithValue("@ab", md5o);
SQLiteDataReader rdr = da.ExecuteReader();
if (rdr.Read())
{
}
else
{
cco.Close();
string strSql = "INSERT INTO md5 (pass , hash) VALUES (?,?)";
using (SQLiteCommand dbCmd = new SQLiteCommand(strSql, cco))
{
dbCmd.CommandType = CommandType.Text;
dbCmd.Parameters.AddWithValue("pass", itemo);
dbCmd.Parameters.AddWithValue("hash", md5o);
cco.Open();
dbCmd.ExecuteNonQuery();
cco.Close();
}
}
cco.Close();
rdr.Close();
}
متغییر هایی که در این صفحه تعریف کردم (کل متغییر ها)
string itemo = "", md5o = "", sha1o = "", sha256o = "";
int xi = 0, cn = 0;
خوب اینم از این
فکر نکنم برای کسی که یکم با برنامه نویسی آشنایی داشته باشه جای ابهام باقی مونده باشه
این پروژه در آموزش هایی که تازه شروع کردیم هم خیلی میتونه کاربرد داشته باشه
امیدوارم مفید بوده باشه
و اینکه لطفا نخوایید که برنامه ی آماده رو اینجا قرار بدم
هیچوقت این کار رو انجام نمیدم
پیروز باشید :)
ایولا...
چه عجب بالاخره یه پست تپل دیدیم ازت :)