C#MD5CryptoServiceProvider

And*_*ner 2 c# encryption md5

我目前正在将旧的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?+ ??>

我能看到几乎相同,但为什么我得到了?人物

Jon*_*eet 5

这是第一个问题,至少:

string szReturn = objEncoder.GetString(btHashedDataBytes);
Run Code Online (Sandbox Code Playgroud)

您正在尝试使用散列,就好像它是UTF-8编码的文本一样.它不是 - 它只是任意的二进制数据.

如果需要将任意二进制数据转换为文本,则应使用类似Base64(例如Convert.ToBase64String)或hex的内容.

(另外,我强烈建议你不要以你现在这样做的方式"处理"异常.你为什么要隐藏这样的问题?为什么你要null在它们超出范围之前设置变量无论如何?)

哦,不要直接在SQL中包含值 - 请改用参数化的SQL.

最后,我现在会使用不同的哈希算法,尤其是密码.您是否可以使用现成的系统进行身份验证,这实际上是由安全专家开发的?安全性很难:我们最好把它留给相对较少知道如何正确行事的人:)请参阅评论以获取更多建议.