.NET MD5 与 PHP MD5
上一篇 / 下一篇 2007-06-11 14:09:05 / 个人分类:PHP
最近在做一个php和.net共同组成的项目,接收.net部分传送过来的一个经md5过的数据,我惊奇的发现,居然和php进行md5的结果不同,这是为啥呢?
*vS$E+WT!G!J0PHPChina 开源社区门户\1gpfF
.net端程序是这么写的:PHPChina 开源社区门户 ]$G&L.Ib+}&|!I4}
EEd!ESeV|l0PHPChina 开源社区门户 O r;F0W1T] s2rt
php端程序是这么写的:
G(u2p|+Q9\@K0
*H)S'z_b'E7n/[0这样下去,程序没法写了,同样的操作为什么结果不同呢?PHPChina 开源社区门户X5ZsS&x
PHPChina 开源社区门户,j![l9B;D,O@
原来php的md5函数输出的结果是转换成16位表示的md5结果,而.net的md5.ComputeHash方法输出的结果是原始的md5结果。(注:php5的md5函数stringmd5( string str [, bool raw_output] )开始支持输出原始结果,参数raw_output只支持php5,但是我在使用php4)PHPChina 开源社区门户 Y5GK)VPQL
PHPChina 开源社区门户 F`d?K)M
如果想让php的结果等同于.net的结果,那么需要对md5函数的结果进行16进制字符串到标准字符串的转换。
;~jq;~7b HrR0那么php程序应改为:
C9w6O*pS0
如果想让.net的结果等同于php的结果,那么需要把md5.ComputeHash方法输出的结果转换成16进制字符串,那么.net程序应该改为:
uht:[)Ac,A G0
*vS$E+WT!G!J0PHPChina 开源社区门户\1gpfF
.net端程序是这么写的:PHPChina 开源社区门户 ]$G&L.Ib+}&|!I4}
System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding();输入的"xutf",得出的结果是"5j1NYFDLhM9dc/XOfRwkyg=="。
5Y:u\%~\3{7ZF0byte[] bytesSrc = encoding.GetBytes("xutf");
r6OD2d5E0AE1z0System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();PHPChina 开源社区门户.ZQ*yuu
byte[] result = md5.ComputeHash(bytesSrc);
*O-lX!a\LA0string keyMd5=Convert.ToBase64String(result);
EEd!ESeV|l0PHPChina 开源社区门户 O r;F0W1T] s2rt
php端程序是这么写的:
G(u2p|+Q9\@K0
$keymd5=base64_encode(md5("xutf"));同样输入"xutf",得出来的结果却是"ZTYzZDRkNjA1MGNiODRjZjVkNzNmNWNlN2QxYzI0Y2E="。PHPChina 开源社区门户s`B9]@x9xK3I
*H)S'z_b'E7n/[0这样下去,程序没法写了,同样的操作为什么结果不同呢?PHPChina 开源社区门户X5ZsS&x
PHPChina 开源社区门户,j![l9B;D,O@
原来php的md5函数输出的结果是转换成16位表示的md5结果,而.net的md5.ComputeHash方法输出的结果是原始的md5结果。(注:php5的md5函数stringmd5( string str [, bool raw_output] )开始支持输出原始结果,参数raw_output只支持php5,但是我在使用php4)PHPChina 开源社区门户 Y5GK)VPQL
PHPChina 开源社区门户 F`d?K)M
如果想让php的结果等同于.net的结果,那么需要对md5函数的结果进行16进制字符串到标准字符串的转换。
;~jq;~7b HrR0那么php程序应改为:
C9w6O*pS0
$md5hex=md5("xutf");PHPChina 开源社区门户UD2]-{-k,F0?1VPHPChina 开源社区门户3z,FwWQ9A?O
$len=strlen($md5hex)/2;PHPChina 开源社区门户 E;o/F2UE.g+H{8uM
$md5raw="";PHPChina 开源社区门户t A Fc#R3rfN
for($i=0;$i<$len;$i++) { $md5raw=$md5raw . chr(hexdec(substr($md5hex,$i*2,2))); } $keyMd5=base64_encode($md5raw);
如果想让.net的结果等同于php的结果,那么需要把md5.ComputeHash方法输出的结果转换成16进制字符串,那么.net程序应该改为:
uht:[)Ac,A G0
System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding();PHPChina 开源社区门户;E2~wqd9T/?s
byte[] bytesSrc = encoding.GetBytes("xutf");
[9l,Woo-Ye0System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
X\,e X7B |7[0byte[] result = md5.ComputeHash(bytesSrc);PHPChina 开源社区门户Sa2vw{+pVh