c#和php对字串MD5值解释不一样,头疼!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#和php对字串MD5值解释不一样,头疼!相关的知识,希望对你有一定的参考价值。
我写过一个php+mysql的网站,后台管理密码明文为admin,密码处理是要经过2次md5加密后存到数据库的. php下返回md5(md5("admin")),结果: admin-->第一次md5处理为:21232f297a57a5a743894a0e4a801fc3 -->第二次md5处理为:c3284d0f94606de1fd2af172aba15bf3. 我还有一个桌面版的md5计算工具,结果和以上是一样的. 现在在做这个网站的客户端工具,使用c#语言,链接网站的数据库,md5加密结果就出现问题了: 部分源码: using System.Security.Cryptography; private void submitbt_Click(object sender, EventArgs e) //输入密码的md5 MD5 md5 = new MD5CryptoServiceProvider(); byte[] output = md5.ComputeHash(Encoding.Default.GetBytes(this.pass.Text)); string pass2md5 = BitConverter.ToString(output).Replace("-", ""); output = md5.ComputeHash(Encoding.Default.GetBytes(pass2md5)); pass2md5 = BitConverter.ToString(output).Replace("-", ""); pass2md5第一次被赋值的时候,值为21232f297a57a5a743894a0e4a801fc3,和php处理的一样,但是第二次结果却为74D839D98630E280DF752E8939454A6B. 这就算了,我怀着侥幸的信息在百度搜索字串74D839D98630E280DF752E8939454A6B(毕竟admin的多级md5处理也不少见),在这个地方也出现:http://www.770921.com/thread-103470-1-1.html(附截图),看来这个字串和admin有关系. 到底怎么回事呢?
参考技术A php我不熟悉,你自己确认下,php的字符
、
字符串
默认
编码
是什么,以及,第二次md5处理是把md5值当成
数值
还是字符串处理的?
c#的byte是8位数值类型,而字符串是按照unicode编码的,如果和php编码不一样,那么出来的东西自然不同。c#的默认unicode编码类别可能是UTF-16LE,我不确定,需要你实际
测试下
,这种编码即使最简单的ascii字符也会被编码为双
字节
。
所以都确认好后,两边编码统一,同时统一用数值或字符串来做md5计算,结果就相同了
补充:
默认应为unicode的一种,我没有实际测试过不敢肯定。
如果编码你都试过了,php又是弱类型,那么md5
返回值
很可能会被php认为是数值,MD5毕竟就是一个非常大的
数字
而已。
你试试别把c#第一次的md5值转换为字符串,直接用byte
数组
作为第二次计算的输入
p.s.
php第一次输出为
小写
,c#为大写,统一后第二次就一致了
以上是关于c#和php对字串MD5值解释不一样,头疼!的主要内容,如果未能解决你的问题,请参考以下文章