我目前正在将旧的ASP.NET 1.1应用程序转换为.NET 4 MVC 3应用程序.
我正在查看密码加密,并在旧代码中编写了一个例程来使用MD5CryptoServiceProvider.
private string EncryptText(string szText)
{
try
{
UTF8Encoding objEncoder = new UTF8Encoding();
MD5CryptoServiceProvider objMD5Hasher = new MD5CryptoServiceProvider();
Byte[] btHashedDataBytes = objMD5Hasher.ComputeHash(objEncoder.GetBytes(szText));
string szReturn = objEncoder.GetString(btHashedDataBytes);
objEncoder = null;
objMD5Hasher = null;
return szReturn;
}
catch
{
return "";
}
}
Run Code Online (Sandbox Code Playgroud)
我已经写了一个快速的.NET 4控制台应用程序并复制了这个函数,所以我可以对数据库中的当前密码进行比较(以确保MD5函数仍然给我相同的输出)
string encTxt = encryptor.EncryptText("fbloggsPass12345");
using (SqlConnection conn = new SqlConnection("Server=server;Database=db;User Id=sa;Password=1111;"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "UPDATE SiteUsers SET Token = '" + encTxt + "' WHERE PKey = 10";
if (cmd.ExecuteNonQuery() > 0)
Console.WriteLine("Updated");
else
Console.WriteLine("Failed");
}
conn.Close();
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
但是数据库中的密码当前是!?MGF +&>,我得到的输出是 !? MGF +& >当我在数据库中存储时转换为???!?? ?MGF?+ ??>
我能看到几乎相同,但为什么我得到了?人物
这是第一个问题,至少:
string szReturn = objEncoder.GetString(btHashedDataBytes);
Run Code Online (Sandbox Code Playgroud)
您正在尝试使用散列,就好像它是UTF-8编码的文本一样.它不是 - 它只是任意的二进制数据.
如果需要将任意二进制数据转换为文本,则应使用类似Base64(例如Convert.ToBase64String)或hex的内容.
(另外,我强烈建议你不要以你现在这样做的方式"处理"异常.你为什么要隐藏这样的问题?为什么你要null在它们超出范围之前设置变量无论如何?)
哦,请不要直接在SQL中包含值 - 请改用参数化的SQL.
最后,我现在会使用不同的哈希算法,尤其是密码.您是否可以使用现成的系统进行身份验证,这实际上是由安全专家开发的?安全性很难:我们最好把它留给相对较少知道如何正确行事的人:)请参阅评论以获取更多建议.