一个意想不到的问题

以专业开发人员为伍 2018-04-24 05:59:25
今天有时间去解决一下某个系统移植数据库到其它服务器上的问题,发现 MD5CryptoServiceProvider(以及其它几个类似的散列方法)的 ComputeHash 计算结果,在不同机器上完全不一样。这样,来自不同机器计算的散列值都乱了。

你们的机器上也是如此吗?如果真的如此,那么 .net 中的有关的 ComputeHash 要整体废掉了,因为毕竟我们要考虑多服务器的问题(比如说一台机器坏掉了,立刻用另一台机器顶上,此时不能让系统垮掉啊)。

如果知道这个原因的,请说明一下。微软对于 .net 的 ComputeHash 这个特性有文档说明吗?还是我测试错误?
...全文
1136 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yflh2 2019-01-04
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/260084619 求多点之间的最短路径算法(至少是4点) 您好 这个怎么解,有思路吗
  • 打赏
  • 举报
回复
顺丰的路由推送接口设置了一个URL地址,但顺丰推送时没有走进我写的方法,能帮一下忙吗
CalvinR 2018-05-24
  • 打赏
  • 举报
回复
大神也用md5加密啊 我还以为会用别的加密方式呢
qq_36466995 2018-05-22
  • 打赏
  • 举报
回复
大神,我能拜你为师么。。。弱弱的小白
  • 打赏
  • 举报
回复
大神,有个问题很急,有时间您回复一下帖子https://bbs.csdn.net/topics/392379304
_明月 2018-05-11
  • 打赏
  • 举报
回复
学习了,路过。
正怒月神 2018-05-04
  • 打赏
  • 举报
回复
引用 10 楼 zhaowei705523962 的回复:
[quote=引用 1 楼 hanjun0612 的回复:] 我测试了md5加密,都是一样的。(2台机器结果相同)
static void Main(string[] args)
        {
            //结果:c1ba5951c95dd17dcbcbdd451a999978

            //Func1
            MD5 md5Hasher = MD5.Create();
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder);


            //Func2
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder1 = new StringBuilder();

            for (int i = 0; i < data1.Length; i++)
            {
                sBuilder1.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder1);


            //Func3
            string str1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("myTest+123", "MD5").ToUpper();
            Console.WriteLine(str1);


            Console.ReadLine();
        }
400分啊。一下子这么多,还真不大适应[/quote] 哈哈,是的,感觉突然成为了暴发户
wrzs 2018-05-04
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
我测试了md5加密,都是一样的。(2台机器结果相同)
static void Main(string[] args)
        {
            //结果:c1ba5951c95dd17dcbcbdd451a999978

            //Func1
            MD5 md5Hasher = MD5.Create();
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder);


            //Func2
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder1 = new StringBuilder();

            for (int i = 0; i < data1.Length; i++)
            {
                sBuilder1.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder1);


            //Func3
            string str1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("myTest+123", "MD5").ToUpper();
            Console.WriteLine(str1);


            Console.ReadLine();
        }
400分啊。一下子这么多,还真不大适应
  • 打赏
  • 举报
回复
发现了,哈哈,我们代码中写
MD5(Encoding.UTF8.GetBytes(pass + "........." + pass.Reverse()))
这种代码,最后边的函数返回的是 .net 的类型描述,结果我们测试的4台机器竟然是各个机器 .net 返回的这个 Reverse().ToString 各不相同。也巧了,假设有两台机器返回的一样,就不至于误解了。 这个代码改成了
MD5(Encoding.UTF8.GetBytes(pass + "........" + string.Join("", pass.Reverse())))
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
@sp1234 我追问一下,最后发现是什么原因了吗?
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
唯一的区别就是编码不同
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.UTF8.GetBytes("123456afafliolasdfa"));
我们在三台不同架构类型CPU的机器上,有完全三个结果。我也希望是看错了,可是这真是不一样啊?!
我在两台机器上测试了utf8编码 结果还是一样。
  • 打赏
  • 举报
回复
欸,不对啊,UTF8 测试也没有问题。
xuzuning 2018-04-24
  • 打赏
  • 举报
回复
有中文才会是编码原因 ASCII 在各种编码中都是一样的
  • 打赏
  • 举报
回复
看来有可能是 Encoding.UTF8 的问题了。
  • 打赏
  • 举报
回复
唯一的区别就是编码不同
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.UTF8.GetBytes("123456afafliolasdfa"));
我们在三台不同架构类型CPU的机器上,有完全三个结果。我也希望是看错了,可是这真是不一样啊?!
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
忘记说了,是2台机器都试过了。结果一样
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
我测试了md5加密,都是一样的。(2台机器结果相同)

static void Main(string[] args)
{
//结果:c1ba5951c95dd17dcbcbdd451a999978

//Func1
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
Console.WriteLine(sBuilder);


//Func2
MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
byte[] data1 = md5Hasher1.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
StringBuilder sBuilder1 = new StringBuilder();

for (int i = 0; i < data1.Length; i++)
{
sBuilder1.Append(data[i].ToString("x2"));
}
Console.WriteLine(sBuilder1);


//Func3
string str1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("myTest+123", "MD5").ToUpper();
Console.WriteLine(str1);


Console.ReadLine();
}

110,476

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧