PDA

View Full Version : سوال: نحوه مقایسه یک رشته هش شده با الگوریتم md5و مقایسه صحت آن



esafb52
شنبه 19 اسفند 1391, 00:18 صبح
با سلام من راستش سرچ کردم ولی فقط تونستم متد هش کردن رو پیدا بکنم من میخوام یک رشته رو که هش کردم باز بیام ببینم آیا رشته جدید با هش شده یکی هست یا نه؟ چطور این مقایسه رو انجام بدم

public string GetMD5Hash(string input)
{
MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
bs = x.ComputeHash(bs);
StringBuilder s = new StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
string password = s.ToString();
return password;
}
ضمنا این متد رو خوب درک نکردم این "x2" اینجا یعنی چی

the king
شنبه 19 اسفند 1391, 01:37 صبح
با سلام من راستش سرچ کردم ولی فقط تونستم متد هش کردن رو پیدا بکنم من میخوام یک رشته رو که هش کردم باز بیام ببینم آیا رشته جدید با هش شده یکی هست یا نه؟ چطور این مقایسه رو انجام بدم

public string GetMD5Hash(string input)
{
MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
bs = x.ComputeHash(bs);
StringBuilder s = new StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
string password = s.ToString();
return password;
}
ضمنا این متد رو خوب درک نکردم این "x2" اینجا یعنی چی


ورودی توابع Hash یک آرایه ای از بایت ها است، پس اون بخش (System.Text.Encoding.UTF8.GetBytes(input برای تبدیل کردن رشته ورودی به آرایه ای از بایت ها
اجباری یه و در همه نمونه های Hash کردن هست. اما خروجی Hash که خودش یک ارایه ای از بایت ها است رو میشه به شیوه های مختلفی بکار برد.
معمولا به رشته تبدیل اش می کنند تا با یک عملگر == بشه بسادگی با یک نمونه دیگه مقایسه اش کرد اما به هر حال اجباری نیست.
برای تبدیل کردن خروجی Hash که خودش آرایه ای از بایت ها است به یک رشته، در این مثال از یک حلقه و ("ToString("x2 استفاده شده.
x بایت های این آرایه رو بصورت یک عدد مبنای 16 (هگزادسیمال) تبدیل می کنه و x2 تضمین می کنه که هر عدد دو رقمی باشه، یعنی فرضا بجای 4 بشه 04

حالا شما یک نمونه قبلی از این GetMD5Hash رو قبلا برای ورودی اصلی (مثلا رمز عبور) اجرا کرده اید و یک رشته بدست آورده اید و در بانک اطلاعاتی ثبت اش کرده اید.
وقتی کاربر رمز عبور رو موقع Login کردن وارد کرد، مجددا با GetMD5Hash اون رو به یک رشته تبدیل می کنید. این رشته رو با اون رشته ای که در بانک اطلاعاتی ثبت شده
مقایسه خواهید کرد (if (a == b که اگر برابر بودند رمز عبور صحیح است وگرنه اشتباه است. همین.

شخصا بجای تبدیل بایت ها به دو رقمی های مبنای 16 از Base64 استفاده می کنم :

using System;
using System.Text;
using System.Security.Cryptography;

public string GetMD5Hash(string input)
{
byte[] bytes = Encoding.Unicode.GetBytes(input);
return Convert.ToBase64String(HashAlgorithm.Create("MD5").ComputeHash(bytes));
}

esafb52
شنبه 19 اسفند 1391, 09:46 صبح
توضيحات عالي بود فقط نحوه مقايسه اش رو كاش با يك نمونه كد نشون ميدادي عالي تر بود .
ممنون

alexmcse
شنبه 19 اسفند 1391, 12:12 عصر
//این قطعه کد را عینا اجرا کنید
private void button1_Click(object sender, EventArgs e)
{string a="amir";
textBox1.Text = Encrypt.EncryptString(a);//این خط استرینگ امیر را اینکریپت میکند
//63eefbd45d89e8c91f24b69f7539942
if (Encrypt.DecryptString(a, "63eefbd45d89e8c91f24b69f7539942"))
{
int i = 1 + 1;//
//MessageBox.Show("ok");
}
else
{
int c = 1 + 5; //MessageBox.Show("error");
}
//این ایف برای این است که آیا استرینگ انکریپت شده (امیر)با انکریپت
// 63eefbd45d89e8c91f24b69f7539942
//برابر است
//اگراسترینگ (امیر ) باشد
//مقدار ترو واگر استرینگ (احمد) باشد مقدار فالس بر میگر داند
// textBox1.Text = Encrypt.DecryptText(a, "63eefbd45d89e8c91f24b69f7539942");
//این خط نام امیر را بر می گرداند
//اگر استرینگ دیگری رابدهید پیغام خطا میدهد

// امیر x2=63eefbd45d89e8c91f24b69f7539942
//امیر x3=0630ee0fb0d405d0890e80c901f0240b60090f705309904 2
//ایکس 3 اینکریپت بیشتری انجام میدهد در نتیجه حافظه بیشتری اشغال می کند
//دیفالت ایکس 2 است
}



کلاس انکریپت
تابع اول انکریپت میکند
دوم برای برسی صحت انکریپت با استرینگ
سوم استرینگ انکریپت شده را بر می گر داند

rezarko
جمعه 02 فروردین 1392, 14:40 عصر
ممنون. چه طور میشه استرینگ انکریپت شده رو برگردونیم به اولش؟

alexmcse
شنبه 03 فروردین 1392, 13:38 عصر
از توابع بالا استفاده کردم

ممنون. چه طور میشه استرینگ انکریپت شده رو برگردونیم به اولش؟

public string DecryptText(string text, string hash)
{
if (Encrypt.verifyMd5Hash(text, hash))
return text;
else
return "خطا";
}

rezarko
شنبه 03 فروردین 1392, 13:43 عصر
به ورودی text چی باید بدیم؟

rezarko
شنبه 03 فروردین 1392, 13:44 عصر
لطفا یه مثال بزنید