問題描述:相同的字符串,經過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