PDA

View Full Version : چک کردن پسوورد با پسوورد hash شده در پایگاه داده



tree1371
جمعه 25 اسفند 1391, 00:44 صبح
سلام دوستان من پسووردم رو با Salt و sha هش کردم

حالا واسه ورود کاربر باید چه جوری مقایسه انجام بدم ؟


می دونم باید پسوورد ورودی رو هش کنم که می کنم اما بقیش رو نمی دونم؟؟

mohsen_f_b
جمعه 25 اسفند 1391, 02:36 صبح
سلام
شما 2 تا مقدار را چطور باهم چک می کنید؟! WHERE در SQL اینکار را برای شما انجام میدهد. شما ورودی خود را Hash کنید و به شرط خود در SQL ارسال کنید اگر برابر بود پس درست است. البته این یک راه حل بود.

موفق باشید

saeed31641
جمعه 25 اسفند 1391, 07:52 صبح
Conn = new SqlConnection();
Conn = new SqlConnection(ConfigurationManager.ConnectionStrin gs["نام کانکشن"].ToString());
if (Conn.State == ConnectionState.Closed)
Conn.Open();
Cmd = new SqlCommand("SELECT * FROM TUser WHERE (FUserName=@FUserName) ");
Cmd.Parameters.AddWithValue("@FUserName", TUser.Text.Trim());
Cmd.Connection = Conn;
SqlDataReader reader = Cmd.ExecuteReader();
reader.Read();
if (reader.HasRows)
{
پسوردت میخونه البته اگه یوزر درست باشه
if (!reader.IsDBNull(reader.GetOrdinal("FUserPass")))
str = reader.GetString(reader.GetOrdinal("FUserPass"));

}
پسورد که از کاربر گرفتی بفرست تو تابع هش و با پسورد بانک .بعد مقایسه میکنه اگه 0باشه پسوردها باهم یکی هستند
int result = string.Compare(ConstList.CalculateMD5Hash(TPass.Te xt.Trim()), str, true);
USerid = reader.GetInt16(reader.GetOrdinal("FUserID"));
if (result == 0)
{
//پسورد ها با هم یکی هستند ورود با موفقیت است
}
else
{
//پسورد ها با هم یکی نیستند
}

tree1371
جمعه 25 اسفند 1391, 12:31 عصر
سلام
شما 2 تا مقدار را چطور باهم چک می کنید؟! WHERE در SQL اینکار را برای شما انجام میدهد. شما ورودی خود را Hash کنید و به شرط خود در SQL ارسال کنید اگر برابر بود پس درست است. البته این یک راه حل بود.

موفق باشید

متاسفانه مشکل اینجاست دوستان سوال رو نمیدونن چیه بعد جواب میدن . دوست من وفتی salt میاد قاطی hash میشه یعنی دیگه یک پسوورد مقدار ثابتی نداره که بخوام این طور چک کنم این یعنی اینکه من باید بهش بفهمونم اونی که تو دیتابیس هست یک string هست که به وسیله hash + salt کد گذاری شده تا بتونه مقایسه کنه مشکل من همینجاست که چه جوری بفهمونم این رو؟

bahar_1984_n
جمعه 25 اسفند 1391, 12:50 عصر
به نطرم یک فیلد طول بتوی جدولت بزارکه تعداد کاراکترهای رمز هش رو نگه میداره بعدش موقع چک کردن برای نام کاربری و پسورد باید از کلمه رمزت تعداد کاراکترهایی رو بگیری که تعدادش با فیلد تعداد برابره اینجوری به salt کاری نداری
فقط هش رو میتونی بخونی و مقایسه کنی.برای مقایسه هم پسوری که کاربر وارد کرده در تکست برای لاگین شدن رو هش کن و با فیلد پسورد+ساب استرینگ(فیلد تعداد) مقایسه کن

saeed31641
جمعه 25 اسفند 1391, 13:03 عصر
ببین دوست عزیز شما یه پسورد دارین در بانک و یکی هم کاربر وارد میکینه باید چک کنی این دوتا باهم برابر هستند یا نه.در پست قبلیم همنی کار کردم اگه اشتباه من گفتم توضیح بدین تا ما هم متوجه بشیم ممنون

saeed31641
جمعه 25 اسفند 1391, 13:05 عصر
اصولا طول پسوردهای رمزگذاری یکی هست بعد کارب ررمز وارد میکنه ابتدا هش میشه .منظورتون بهار خانم نفهمیدم

tree1371
جمعه 25 اسفند 1391, 13:06 عصر
ببین دوست عزیز شما یه پسورد دارین در بانک و یکی هم کاربر وارد میکینه باید چک کنی این دوتا باهم برابر هستند یا نه.در پست قبلیم همنی کار کردم اگه اشتباه من گفتم توضیح بدین تا ما هم متوجه بشیم ممنون

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

tree1371
جمعه 25 اسفند 1391, 13:30 عصر
آقا سعید میشه درباره این کد بیشتر توضیح بدید تا اونجایی که من پسوود رو می خوانم قبول و حل هست اما بقیش رو جاهایی که من باید پسوورد بزارم و غیره رو فارسی بزارید عالی میشه . یک جوری بدید تا بشه کامل کد رو فهمید عالیه.

saeed31641
جمعه 25 اسفند 1391, 13:59 عصر
int result = string.Compare(ConstList.CalculateMD5Hash(TPass.Te xt.Trim()), str, true);

شما پسورد میخونی تموم.پس شما پسورد از بانک گرفتی وداری.خوب حالا شما باید پسورد کاربر که تو تکس باکس وارد کرده رو بگیری که راحت اونم می تونی بگیری. خوب حالا پسوردی که از تکس باکس گرفتی بیا به همون روشی که خودت میدونی تبدیل به هش کن وبریز تو یه متغییری بنام مثلا str1
مساله حل شد شما دوتا پسورد هش دارین ایا اگه این دوتا برابر باشه نتیجه نمیگرین که پسورد درست هست .
پس اگه درسته کاربر به صفحه مورد نظر هدایت کن

tree1371
جمعه 25 اسفند 1391, 14:31 عصر
من اینو نوشتم هرکاری می کنم پسوورد با هم جور در نمیاد مدل کدینگ هم نوشتم کجاش اشتباه کردم؟


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Web.Security;




public partial class Default2 : System.Web.UI.Page
{
SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrin gs["conn"].ConnectionString);



protected void Page_Load(object sender, EventArgs e)
{
Button1.Click += Fire;

}

private void Fire(object sender, EventArgs e)
{
int num = 1000;
string salt = CreateSalt(num);
string saltpwd = string.Concat(salt, TextBox2.Text);
CreatePasswordHash(saltpwd);

string str = string.Empty;
if (Conn.State == ConnectionState.Closed)
Conn.Open();
SqlCommand Cmd = new SqlCommand("SELECT * FROM Users WHERE (usr_UserName=@FUserName) ");
Cmd.Parameters.AddWithValue("@FUserName", TextBox1.Text.Trim());
Cmd.Connection = Conn;
SqlDataReader reader = Cmd.ExecuteReader();
reader.Read();
if (reader.HasRows)
{
if (!reader.IsDBNull(reader.GetOrdinal("usr_Password")))
{
str = reader.GetString(reader.GetOrdinal("usr_Password"));
}

}

int result = string.Compare(CreatePasswordHash(saltpwd).Trim(), str, true);
if (result == 0)
{
Label1.Text = "Good";
}
else
{
Label1.Text = "Bad";
}
}


private string CreateSalt(int size)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);

}

private string CreateSalt1(int size)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);

}

private string CreatePasswordHash(string pwd)
{
byte[] Data = System.Text.UTF8Encoding.UTF8.GetBytes(pwd);
SHA512Managed sha = new SHA512Managed();
byte[] HashValue = sha.ComputeHash(Data);
string result = string.Empty;

foreach (var h in HashValue)
result += string.Format("{0:X}", h);

return result;
}




protected void Button2_Click(object sender, EventArgs e)
{

}
}

saeed31641
جمعه 25 اسفند 1391, 14:49 عصر
private string CreateSalt1(int size)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);

}

اینا اینجا چیکراند کدی که پسورد زمان ثبت نامه هش میکنی رو بزار اینجا.شما از یک روش برای هش کردن استفاده نمیکنی که جواب نمیده

saeed31641
جمعه 25 اسفند 1391, 14:55 عصر
شما یه جای داری اشتباه میکنی پسوردات یکی نیستند کداتم یه نگاهی بکن اون trim بردار

tree1371
جمعه 25 اسفند 1391, 15:40 عصر
private string CreateSalt1(int size)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);

}

اینا اینجا چیکراند کدی که پسورد زمان ثبت نامه هش میکنی رو بزار اینجا.شما از یک روش برای هش کردن استفاده نمیکنی که جواب نمیده

این قسمت Salt می سازه و با password یکی میکنه بعد ازش یک هش درست می کند

tree1371
جمعه 25 اسفند 1391, 15:43 عصر
نه دو تاش رو با همین روش هش می کنم. اول پسوورد رو با یک Salt یکی می کنم بعد هش می کنم بعد ذخیره .

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

می شه خودتون یک پروژه بنویسی که با Salt و sha512 هش بشه بعد چک کند که درسته یا نه؟

saeed31641
جمعه 25 اسفند 1391, 15:46 عصر
بین کدت درست شما یه کار کن تا مشکلت حل بشه
هر دو پسورد تو پیجت برای خودت نشون بده ببین چی داره نشون میده
هم پسورد که از بانک گرفته و هم پسورد تکس باکس که هش میکنی.کد نویسی مشکلی نداره

tree1371
جمعه 25 اسفند 1391, 16:17 عصر
فهمیدم مشکل کجاست.

اینو واسه دوستانی می گم که شاید مثل من مشکل داشته باشند.

قبل از هر چیز از آقا سعید تشکر می کنم.

من این مسئله رو تو سایت codproject طرح کردم با روش آقا سعید که مشکلی نداشت تنها مشضکل اینجا بود چون من Salt رو به صورت راندم ایجاد می کنم باید اون رو هم داشته باشم و ذخیره کنم تا برای هش کردن از اون salt استفاده کنم یا اینکه شما دوستان یم تونید یک Salt رو خودتون بسازید چون خوب کار عاقلانه ای نیست ما Salt رو در دیتابیس ذخیره کنیم . بعد باید با همون Salt هش کنم و مقایسه کنم

بازم تشکر از شما آقا سعد جان بابت راهنمایی و صبر زیادتون.