PDA

View Full Version : مشكل با hash كردن



r_mehrizi
چهارشنبه 27 آبان 1388, 10:32 صبح
داخل ديتابيس اخرين زماني كه كاربر لاگين كرده به صورت hash شده وجود دارد
من ميخوام زمان كنوني را بگيرم و با زماني كه داخل ديتابيس به صورت hash شده وجود دارد مقايسه كنم درصورتي كه تاريخ كنوني بزرگتر از تاريخ داخل ديتابيس هست اجازه ورود بدم

مشكل من اينه كه ميخوام تاريخ داخل ديتابيس را كه hash شده از hash خارج كنم ايا تابع خاصي وجود داره خيلي ضروري هستش لطفا راهنمايي كنيد

Behrouz_Rad
چهارشنبه 27 آبان 1388, 15:07 عصر
داده های Hash شده یا بهتر بگیم الگوریتم های Hash، برگشت پذیر نیستند.
از الگوریتم های رمزنگاری متقارن مثل Rijndael و DES استفاده کنید.

Encryption و Hash و Code، سه اصطلاح مختلف هستند و کاربرد مجزایی دارند.

موفق باشید.

ennovation
چهارشنبه 27 آبان 1388, 15:14 عصر
سلام
اول این متغیر رو تعریف کن . مقدارش به دلخواه خودت هر چی دوست داری بنویس .


static String Secret_key = "secret code you can choose your code !%&aAbB&%!";
حالا واسه هاش کردن تاریخ از این تابع استفاده کن دو تا تابع رو همینجور که هست توی برنامه خودت کپی کن لازم به تغییری نیست . :لبخندساده:


static String EncryptString(String Value)
{

RijndaelManaged rd = new RijndaelManaged();

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

Byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(Secret_key) );

md5.Clear();
rd.Key = key;
rd.GenerateIV();

Byte[] iv = rd.IV;
MemoryStream ms = new MemoryStream();

ms.Write(iv, 0, iv.Length);

CryptoStream cs = new CryptoStream(ms, rd.CreateEncryptor(), CryptoStreamMode.Write);
Byte[] data = System.Text.Encoding.UTF8.GetBytes(Value);

cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();

Byte[] encdata = ms.ToArray();

cs.Close();
rd.Clear();
return Convert.ToBase64String(encdata);
}
با این تابع هم میتونی تاریخ رو به فرمت اصلی برگردونی و مقدار برگشتی این تابع رو با تاریخ جدید مقایسه کنی


static String DecryptString(String Value)
{

RijndaelManaged rd = new RijndaelManaged();
int rijndaelIvLength = 16;
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
Byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(Secret_key) );

md5.Clear();

Byte[] encdata = Convert.FromBase64String(Value);
MemoryStream ms = new MemoryStream(encdata);
Byte[] iv = new byte[16];

ms.Read(iv, 0, rijndaelIvLength);
rd.IV = iv;
rd.Key = key;

CryptoStream cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Read);


Byte[] data = new byte[ms.Length - rijndaelIvLength];
int i = cs.Read(data, 0, data.Length);
cs.Close();
rd.Clear();
return System.Text.Encoding.UTF8.GetString(data, 0, i);


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

ولی اگه من جای تو بودم اینکار رو نمیکردم و فقط اون تاریخی که میگی رو داخل بانک به جای اینکه از نوع Date تعریف کنم از نوع Timestamp تعریف میکردم و این همه کار رو نمیخواست انجام بدم . چون که readolny است و فقط هر وقت که تغییری در فیلد اعمال بشه مقدارش عوض میشه .