【问题标题】:convert string value to md5将字符串值转换为 md5
【发布时间】:2020-06-21 12:07:45
【问题描述】:

我正在尝试将字符串转换为 md5 那就是我所做的:

  public static string MD5Hash(string input)
        {
            StringBuilder hash = new StringBuilder();
            MD5CryptoServiceProvider md5provider = new MD5CryptoServiceProvider();
            byte[] bytes = md5provider.ComputeHash(new UTF8Encoding().GetBytes(input));

            for (int i = 0; i < bytes.Length; i++)
            {
                hash.Append(bytes[i].ToString("x2"));
            }
            return hash.ToString();
        }

当我在 MD5Hash("MyCode") 中测试时,上面的代码返回:6403df8223bf310152ad235731e79902 (32字符)

但我数据库上的 md5 是 0x6403DF8223BF310152AD235731E79902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000> (000000000)

它缺少开头的 "0X" 和结尾的 "zeros"

p>

【问题讨论】:

  • 你从数据库中传递给这个函数的值是多少?
  • 更改数据库>表格>列类型为 varchar(32)
  • @Amid 我不能,数据库已经填满了用户数据,我不能更改它,有些密码有 33 个字符
  • @ChetanRanpariya 值类型是二进制(64)
  • 这个函数怎么会为MyCode返回6403df8223bf310152ad235731e79902

标签: c# sql byte md5


【解决方案1】:

MD5 算法的哈希大小为 128 位。

MD5 类的 ComputeHash 方法以 16 字节数组的形式返回哈希值。请注意,某些 MD5 实现会生成 32 个字符、十六进制格式的哈希。

所以你必须检查数据库为什么你得到额外的字符?

供您参考,MyCode 的正确 MD5 值为 8e995273698f53088fe2ad4a0888d213

生成MD5的代码如下。

public static string GenerateMD5(string input)
{
    
    using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
    {
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
        byte[] hashBytes = md5.ComputeHash(inputBytes);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("X2"));
        }
        return sb.ToString();
    }
}

参考:https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.md5?view=netcore-3.1#remarks

【讨论】:

  • 感谢您的回复。我只是将“MyCode”替换为我的真实代码,这就是为什么
  • 我得到了额外的字符,因为列的类型是二进制(64)
  • 所以按照建议请将长度更改为 32,但我仍然怀疑你为什么会得到 0x
  • 我无法更改数据库中列的类型,因为我不能,我正在处理现有数据库。谢谢
  • 数据库管理员说他们在使用查询的 sql 中插入密码为 "HASHBYTES('md5','MyCode')"
【解决方案2】:

这对我有用 -

    public static string MD5Hash(string text)
    {
        MD5 md5 = new MD5CryptoServiceProvider();

        //compute hash from the bytes of text  
        md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text));


        //get hash result after compute it  
        byte[] result = md5.Hash;

        StringBuilder strBuilder = new StringBuilder();
        for (int i = 0; i < result.Length; i++)
        {
            //change it into 2 hexadecimal digits  
            //for each byte  
            strBuilder.Append(result[i].ToString("x2"));
        }

        return strBuilder.ToString();
    }

【讨论】:

  • 它返回的值与我的相同.. 感谢您的回复
【解决方案3】:

试试这个

    public static string Md5Hash(string text)
    {
        using (var md5 = new MD5CryptoServiceProvider())
        {
            using (var tds = new TripleDESCryptoServiceProvider())
            {
                tds.Key = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(encryptionKey));
                tds.Mode = CipherMode.ECB;
                tds.Padding = PaddingMode.PKCS7;

                using (var transform = tds.CreateEncryptor())
                {
                    byte[] textBytes = UTF8Encoding.UTF8.GetBytes(text);
                    byte[] bytes = transform.TransformFinalBlock(textBytes, 0, textBytes.Length);
                    return Convert.ToBase64String(bytes, 0, bytes.Length);
                }
            }
        }
    }

【讨论】:

  • 这是什么:encryptionKey
  • 抱歉忘了说,它是一个固定的散列字符串 static string encryptionKey { get;放; } = "A!9HHhi%XjjYY4YP2@Nob009X";
【解决方案4】:

根据您的示例,在您的数据库中生成 64 个字符的字符串类似于:

public static string MD5Hash(string input)
{
    using (var md5 = new MD5CryptoServiceProvider())
        return string.Concat("0x",
            BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(input)))
            .Replace("-", string.Empty).PadRight(62, '0'));
}

在这种情况下,我不会将函数命名为 MS5Hash,如您所见,数据库字符串是串联的字符串,MD5 哈希只是每个字符串的中间部分。

【讨论】:

  • @Bfs 欢迎您。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多