md5加密 控制檯傳入與web傳入參數 md5加密結果不一樣

問題描述:相同的字符串,經過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
相關文章
相關標籤/搜索