我有以下代码来检查md5加密密码与用户输入密码:
UserDAO userDAO = new UserDAO();
// encrypt the input password
MD5 md5 = new MD5CryptoServiceProvider();
UTF8Encoding encoder = new UTF8Encoding();
Byte[] encryptedPassword;
encryptedPassword = md5.ComputeHash(encoder.GetBytes(TxtBoxPassword.Text));
// get information for this username and begin checking authentication
DataTable data = userDAO.GetUserInformation(TxtBoxUsername.Text);
if (data.Rows.Count == 0)
{
LblError.Text = "Wrong username!";
return;
}
Byte[] password = (Byte[])data.Rows[0]["Password"];
if (!Convert.ToBase64String(password).Equals(Convert.ToBase64String(encryptedPassword)))
{
LblError.Text = "Wrong password!";
return;
}
问题是我可以在我的计算机上正常运行此代码(admin / 123456正确验证),而当我将我的网站发布到服务器时,检查总是返回“密码错误”?是什么给了什么?
答案 0 :(得分:3)
不确定为什么你的工作不起作用,但是当我编写下面的SHA512实现时,我遇到了一些哈希问题。它不会像您通常看到的那样为人类输出。因此,您的数据类型在数据库中应该是二进制的。这里也是我使用SHA512的实现(使用salt更改)。使用ByteArrayToHexString将其置于人类可识别的格式中。然后,您可以在数据库中使用varchar。
/// <summary>
/// Takes a string as input, SHA512 hashes it, and returns the hexadecimal representation of the hash as a string.
/// </summary>
/// <param name="toHash">string to be hashed</param>
/// <returns>hexadecimal representation of the hash as a string</returns>
private string GetHash(string toHash)
{
/* As of this writing, both the –Cng and –CryptoServiceProvider implementation classes are FIPS-certified,
* but –Managed classes are not. http://msdn.microsoft.com/en-us/magazine/ee321570.aspx
*/
// Salt the string
toHash = "%my" + toHash.Insert(Convert.ToInt16(toHash.Length / 2), "!secret") + ".sauce#";
SHA512CryptoServiceProvider hasher = new SHA512CryptoServiceProvider();
byte[] hashBytes = hasher.ComputeHash(Encoding.Unicode.GetBytes(toHash));
hasher.Clear();
return ByteArrayToHexString(hashBytes);
}
/// <summary>
/// Takes a byte[] and converts it to its string hexadecimal representation
/// </summary>
/// <param name="ba">Array of bytes[] to convert</param>
/// <returns>string, hexadecimal representation of input byte[]</returns>
private string ByteArrayToHexString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
答案 1 :(得分:0)
字节[]是否在数据库中被激活?你可以在进入数据库时记录哈希值,并在你在这里获取时记录它并查看它们是否相等吗?
另外,请注意MD5被认为是弱的,并且您没有使用密码。如果发生数据泄露,这很容易导致帐户泄露。考虑将SHA1与随机盐一起使用。
答案 2 :(得分:0)
在密码被哈希并保存到UserDAO之前,密码是否为UTF8?