
java的32位MD5加密与php中的32位MD5加密结果不一样。求帮助。急急急
java:System.out.println(mad.toMd5(mad.toMd5("4451711")+"09519f").toLowerCase());结果:01...
java: System.out.println(mad.toMd5(mad.toMd5("4451711")+"09519f").toLowerCase());
结果:0169d79a79c506c7289359b1104f69ad
php: echo md5(md5("4451711")."09519f");
结果:4c3dac55f41d67aeea814d09d5865aa9 展开
结果:0169d79a79c506c7289359b1104f69ad
php: echo md5(md5("4451711")."09519f");
结果:4c3dac55f41d67aeea814d09d5865aa9 展开
1个回答
展开全部
Java的字符串是unicode编码,不受源码文件的编码影响;而PHP的编码是和源码文件的编码一致,受源码编码影响。例中java字符数据在散列时的编码和php编码未能保持一致,我认为这是导致输出不同的“病理”
由于未知mad.toMd5的具体实现,问题直接成因应该在toMd5的String到byte[]转换时的编码上,或者未设置或者设置了错误的编码
但只要java的字符串先getBytes获得字节串,并和php源码编码一致,就能获得一致结果。
由于未知mad.toMd5的具体实现,问题直接成因应该在toMd5的String到byte[]转换时的编码上,或者未设置或者设置了错误的编码
但只要java的字符串先getBytes获得字节串,并和php源码编码一致,就能获得一致结果。
追问
java:mad.toMd5("4451711").toLowerCase() 获得的结果与 php:md5("4451711")的结果一样
都是65c8065d688842d1444d2dd42550692b
但是为什么加上一个字符串后再加密一次就不一样了呢
追答
至于为什么不一样?
问题出在你的toMad5方法“在实现或调用上一定不正确”。
====================
import java.security.MessageDigest;
public class Test{
public static void main(String[] args) {
try{
System.out.println(
toMD5(( toMD5( ("4451711").getBytes("GBK") )+"09519f" ).getBytes("GBK"))
);
}catch(Exception e){
e.printStackTrace();
}
}
public static String toMD5(byte[] source) {
try{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update( source );
StringBuffer buf=new StringBuffer();
for(byte b:md.digest())
buf.append(String.format("%02x", b&0xff) );
return buf.toString();
}catch( Exception e ){
e.printStackTrace(); return null;
}
}
}
=============
输出
4c3dac55f41d67aeea814d09d5865aa9
和之前php的输出一致
4c3dac55f41d67aeea814d09d5865aa9
给出toMd5源码,可以找出问题给你。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询