我一直在反覆閱讀代碼以查看錯誤發生的位置,但我無法找到它。我從stackoverflow複製了這段代碼,從來沒有真正檢查過它,或者完全理解它來修復它。 我從Web服務接收密碼,哈希,醃製並將其保存到SqlServer 2008. SqlServer上的變量被聲明爲郵件爲nvarchar(64),哈希爲varbinary(128),salt爲varbinary(128) 。 密碼正在保存,但當我嘗試檢查密碼是否正確時,該方法始終返回false。 這是我的方法。將密碼散列到SqlServer
public int InsertData(string mail,string Password)
{
int lineas;
UserData usuario = HashPassword(Password);
using (SqlConnection connection = new SqlConnection(Connection))
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "INSERT INTO Usuarios (Mail,Hash,Salt) VALUES (@mail,@hash,@salt)";
command.Parameters.AddWithValue("@mail", mail);
command.Parameters.AddWithValue("@hash", usuario.Password);
command.Parameters.AddWithValue("@salt", usuario.salt);
connection.Open();
lineas=command.ExecuteNonQuery();
}
usuario = null;
return lineas;
}
private UserData HashPassword(string Password)
{
//This method hashes the user password and saves it into the object UserData
using (var deriveBytes = new Rfc2898DeriveBytes(Password, 20))
{
byte[] salt = deriveBytes.Salt;
byte[] key = deriveBytes.GetBytes(20); // derive a 20-byte key
UserData usuario = new UserData();
usuario.Password = key;
usuario.salt = salt;
return usuario;
}
}
而且下一個方法是我使用的一個驗證德密碼,它始終返回false
private bool CheckPassword(string Password, byte[] hash, byte[] salt)
{
// load salt and key from database
using (var deriveBytes = new Rfc2898DeriveBytes(Password, salt))
{
byte[] newKey = deriveBytes.GetBytes(20); // derive a 20-byte key
if (!newKey.SequenceEqual(hash))
return false;
else
return true;
}
}
這個方法接收登錄信息
public bool ValidateLogIn(string mail, string Password)
{
using (SqlConnection connection = new SqlConnection(Connection))
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "Select * from Usuarios where [email protected]";
command.Parameters.AddWithValue("@mail",mail);
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
reader.Read();
byte[] hash = (byte[])reader["Hash"];
byte[] salt = (byte[])reader["Salt"];
if(CheckPassword(Password,hash,salt))
{
/
UpdateData(mail, Password);
return true;
}
else
{
return false;
}
}
}
}
任何想法可能是什麼錯誤?
編輯:我發現在那裏我得到的散列碼 https://stackoverflow.com/a/4330586/1861617
保存和驗證數據時散列和salt是否相同? – Sam
是的,我將散列和鹽保存到同一行。然後加載相同的行並根據密碼對其進行驗證 –
您是否嘗試過在代碼中的任意位置設置斷點並將其執行到100%,確保變量持有您認爲它們持有的內容(並驗證代碼是否按預期工作)?另外,你是否收到任何錯誤? – Sam