C#的MD5加密为啥和JAVA的加密出来的结果不一样?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#的MD5加密为啥和JAVA的加密出来的结果不一样?相关的知识,希望对你有一定的参考价值。

public string md5(string password)

MD5 md5 = new MD5CryptoServiceProvider();
byte[] res = md5.ComputeHash(Encoding.Default.GetBytes(password), 0, password.Length);
StringBuilder builder=new StringBuilder();
foreach(byte b in res)
builder.Append(Convert.ToString(b,16));

return builder.ToString();


加密字符串:357011000026Admin123420141118032643
JAVA加密结果:e820cbe17f92ff38288c33866d3742ee

通过以上算法,实际C#加密的结果是:4d93e8fb6d6f3a6b6e7fc9381a5b5a1

哪位大神能帮忙看下?能否提供下算法,谢谢。

你弄错了吧,我把代码原封不动复制下来测试过,和java的结果一样。

        static void Main(string[] args)
        
            string input = "357011000026Admin123420141118032643";
            string output = md5(input);
            Console.WriteLine(output);
            Console.ReadLine();
        

        public static string md5(string password)
        
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] res = md5.ComputeHash(Encoding.Default.GetBytes(password), 0, password.Length);
            StringBuilder builder = new StringBuilder();
            foreach (byte b in res)
            
                builder.Append(Convert.ToString(b, 16));
            
            return builder.ToString();
        

追问

这个算法是有的可以,有的不行例如这个就不一样

3500000112345620141118050554

JAVA加密结果是:36bd1a4ad036b95e4c4fcf053b8c1de8
C# 加密结果是:36bd1a4ad036b95e4c4fcf53b8c1de8

还是不一样,知道什么原因吗?谢谢哈。

追答

下面这个和java结果一样了。

        static void Main(string[] args)
        
            string input = "3500000112345620141118050554";
            string output = GetMd5Hash(input);
            Console.WriteLine(output);
            Console.ReadLine();
        

        static string GetMd5Hash(string input)
        
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            
                sBuilder.Append(data[i].ToString("x2"));
            
            return sBuilder.ToString();
        

参考技术A 因为Java的byte范围是[-128~127]有符号位,C#的byte的范围是[0~255]无符号位,所以才会出现不一致

C# MD5 和/或其他加密 oledb (access 2007)

【中文标题】C# MD5 和/或其他加密 oledb (access 2007)【英文标题】:C# MD5 and or other encryption oledb (access 2007) 【发布时间】:2013-04-28 10:48:09 【问题描述】:

对加密和一些利弊进行了一些研究。我有一个非常有效的登录系统,它使用命令参数将用户信息传递给 sql 字符串,以尝试避免 sql 注入。然而,我的下一个目标是在创建密码时对密码进行加密,然后将其存储在数据库中。

我使用 C# 编程,使用 Visual Studio Ultimate 2010 和 Access 2007。

我不是在寻找一个直截了当的答案,虽然如果有人给我一个我不会抱怨,但如果有人能至少指出我正确的方向,那将非常感谢! :D

亲切的问候,尼克

【问题讨论】:

使用慢速(迭代)哈希和盐。单次迭代哈希很糟糕,即使它是 SHA-2。见How to securely hash passwords?。在 C# 中,最简单的解决方案是使用至少 10000 次迭代的 Rfc2898DeriveBytes。 【参考方案1】:

您应该考虑使用带盐的安全哈希算法 (SHA)。

在这种情况下,哈希算法的目的是存储代表用户密码的令牌。您实际上不会存储密码,理想情况下,您不应该能够以明文形式重新创建用户密码。

当您尝试登录时,您将通过相同的过程传递所提供的密码,并查看哈希值是否匹配。

【讨论】:

感谢回复,sha-1 和 sha-256 有什么区别吗?我将假设 256 是转换为的位数?? 有很多可用的 SHA 版本。 SHA-1 是 160 位标准,有一些弱点。 SHA-256 是 SHA-2 标准的一部分。 en.wikipedia.org/wiki/Secure_Hash_Algorithm 有一个很好的概述。重要的是要记住,安全性真的很难做到正确,如果您对它不满意,并且如果您正在尝试保护重要数据,您确实需要花一些时间做一些研究。 twit 网络上有一个名为 securitynow 的很棒的播客,其中有一些非常好的讨论。哦,是的,256 将反映哈希值的大小。 哈希算法的选择在这里几乎无关紧要。在这种情况下,甚至没有对 MD5 的实际攻击。也没有理由使用大于 128 位的输出大小,无论选择散列。但是使用慢速/迭代方案很重要,而您没有提到这一点。

以上是关于C#的MD5加密为啥和JAVA的加密出来的结果不一样?的主要内容,如果未能解决你的问题,请参考以下文章

MD5加密C#和js代码加密结果不同

C#代码加密字符串,与SQL加密结果不一致

用C#实现MD5的加密(转载)

JAVA做一个简单的MD5加密...

JAVA和C#MD5加密结果不一样,怎么办

java的32位MD5加密与php中的32位MD5加密结果不一样.求帮助