问题描述:相同的字符串,经过main方法调用md5加密的结果,与web api参数接收后,md5加密,结果却不一样。java
import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Digest { private static MessageDigest md5=null; public static String getDigest(String msg) throws UnsupportedEncodingException, NoSuchAlgorithmException { if(null == md5) { md5=MessageDigest.getInstance("MD5"); } byte[] byteArray=null; byteArray=msg.getBytes(); byte[] md5Bytes=md5.digest(byteArray); StringBuffer hexValue=new StringBuffer(); 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)); } return hexValue.toString(); } }
查看MD5的代码实现(如上),会发现web
byteArray=msg.getBytes();算法
该行代码在不一样的环境下得到的结果可能不一样,这样也形成MD5结果不同的缘由。apache
要保证在不一样环境下MD5结果相同,则必须使用相同的字符编码,好比:api
byteArray=msg.getBytes("UTF-8"); 数组
/** 对字符串进行MD5加密 */ private static String encodeByMD5(String originString) { if (originString != null) { try { // 建立具备指定算法名称的信息摘要 MessageDigest md = MessageDigest.getInstance("MD5"); // 使用指定的字节数组对摘要进行最后更新,而后完成摘要计算 byte[] results = md.digest(originString.getBytes("UTF-8")); // 将获得的字节数组变成字符串返回 String resultString = byteArrayToHexString(results); return resultString.toUpperCase(); } catch (Exception ex) { ex.printStackTrace(); } } return null; }
该问题能够经过以下代码演示:app
import static org.apache.commons.codec.digest.DigestUtils.md5Hex; String text = "error606@qq.com|工工工|!@$%&1000"; String r1 = DigestUtils.md5Hex(text); System.out.println(r1); //b08f601a7b6b440dfa3ed6eb353c2d24 String r2 = DigestUtils.md5Hex(text.getBytes("UTF-8")); System.out.println(r2); //b08f601a7b6b440dfa3ed6eb353c2d24 String r3 = DigestUtils.md5Hex(text.getBytes("GBK")); System.out.println(r3); //db9e73be9742ed2a66202a62f491ef03 String r4 = DigestUtils.md5Hex(text.getBytes("ISO-8859-1")); System.out.println(r4); //cd64703ba680391d452765d564d7e13e