开发中遇到md5加密不一致问题,排除了上下文编码,加密内容问题。
爬了各类资料,最终找到了原因。
/**对字符串进行MD5加密*/
private staticString encodeByMD5(String originString) {if (originString != null) {try {
//创建具有指定算法名称的信息摘要
MessageDigest md = MessageDigest.getInstance("MD5");//使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
byte[] results = md.digest(originString.getBytes("UTF-8"));//将得到的字节数组变成字符串返回
String resultString =byteArrayToHexString(results);returnresultString.toUpperCase();
}catch(Exception ex) {
ex.printStackTrace();
}
}return null;
}
需要给加密内容进行指定编码格式获取,对比一下PHP的MD5,真是醉了。
简单的得出结论: PHP不根据上下文编码格式进行字符的加密。相比于JAVA的加密,是根据加密内容的编码格式进行加密的,需要指定当前上下文对应的编码格式才能获取到想要的加密结果。
原因示例:
此类错误通常是编码格式的问题 如果我们控制台输入的字符是 BGK格式的 而 web传入的是UTF-8 我们 toString()查看内容 表明上是看不出区别的 这就导致了相同字符串 加密后得到的结果不同 如下面的小例子
import staticorg.apache.commons.codec.digest.DigestUtils.md5Hex;
String text= "error606@qq.com|工工工|!@$%&1000";
String r1= md5Hex(text); //b08f601a7b6b440dfa3ed6eb353c2d24
String r2 = md5Hex(text.getBytes("UTF-8")); //b08f601a7b6b440dfa3ed6eb353c2d24
String r3 = md5Hex(text.getBytes("GBK")); //db9e73be9742ed2a66202a62f491ef03
我们再来看一下Java是如何实现MD5的:
importjava.io.UnsupportedEncodingException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;public classMD5Digest {private static MessageDigest md5=null;public static String getDigest(String msg) throwsUnsupportedEncodingException, NoSuchAlgorithmException {if(null ==md5) {
md5=MessageDigest.getInstance("MD5");
}byte[] byteArray=null;
byteArray=msg.getBytes();byte[] md5Bytes=md5.digest(byteArray);
StringBuffer hexValue=newStringBuffer();for(int i=0; i < md5Bytes.length; i++) {int val=((int)md5Bytes[i]) & 0xff;if(val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}returnhexValue.toString();
}public static void main(String []args) throwsUnsupportedEncodingException, NoSuchAlgorithmException{
System.out.println(getDigest("test测试"));
}
}
通过上面的代码我们会发现一个问题:
byteArray=msg.getBytes();
在不同的环境下获得的结果可能是不一样的,这样也造成很多MD5结果不一样。
所以要保证在不同环境下MD5结果相同那么必须使用相同的字符编码,比如:byteArray=msg.getBytes("ISO-8859-1");
PS:
http://blog.csdn.net/w627782664/article/details/7064273
博客讲述了在Java中遇到MD5加密结果不一致的问题,问题根源在于编码格式。Java的MD5加密依赖于字符串的编码,而PHP则不考虑上下文编码。示例代码显示,不同编码(如GBK、UTF-8)会导致相同的字符串加密后得到不同的结果。解决办法是确保在所有环境中使用相同的字符编码,如`byteArray=msg.getBytes("ISO-8859-1");`来保证MD5结果的一致性。
1448

被折叠的 条评论
为什么被折叠?



