1. 程式人生 > >java常用的2中加密密碼方式MD5和Encrypt

java常用的2中加密密碼方式MD5和Encrypt

Encrypt方式加密
package com.cc.common.util;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * 功能描述 * 加密常用類 */ public class EncryptUtil { // 金鑰是16位長度的byte[]進行Base64轉換後得到的字串 public static String key = "LmMGStGtOpF4xNyvYt54EQ=="; /** * <li> * 方法名稱:encrypt</li> <li> * 加密方法 * @param xmlStr * 需要加密的訊息字串
* @return 加密後的字串 */ public static String encrypt(String xmlStr) { byte[] encrypt = null; try { // 取需要加密內容的utf-8編碼。 encrypt = xmlStr.getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // MD5Hash碼,並組合加密陣列 byte[] md5Hasn = null;
try { md5Hasn = EncryptUtil.MD5Hash(encrypt, 0, encrypt.length); } catch (Exception e) { e.printStackTrace(); } // 組合訊息體 byte[] totalByte = EncryptUtil.addMD5(md5Hasn, encrypt); // 取金鑰和偏轉向量 byte[] key = new byte[8]; byte[] iv = new byte[8]; getKeyIV(EncryptUtil.key, key, iv); SecretKeySpec deskey = new SecretKeySpec(key, "DES"); IvParameterSpec ivParam = new IvParameterSpec(iv); // 使用DES演算法使用加密訊息體 byte[] temp = null; try { temp = EncryptUtil.DES_CBC_Encrypt(totalByte, deskey, ivParam); } catch (Exception e) { e.printStackTrace(); } // 使用Base64加密後返回 return new BASE64Encoder().encode(temp); } /** * <li> * 方法名稱:encrypt</li> <li> * 功能描述: * 解密方法 * @param xmlStr * 需要解密的訊息字串 * @return 解密後的字串 * @throws Exception */ public static String decrypt(String xmlStr) throws Exception { // base64解碼 BASE64Decoder decoder = new BASE64Decoder(); byte[] encBuf = null; try { encBuf = decoder.decodeBuffer(xmlStr); } catch (IOException e) { e.printStackTrace(); } // 取金鑰和偏轉向量 byte[] key = new byte[8]; byte[] iv = new byte[8]; getKeyIV(EncryptUtil.key, key, iv); SecretKeySpec deskey = new SecretKeySpec(key, "DES"); IvParameterSpec ivParam = new IvParameterSpec(iv); // 使用DES演算法解密 byte[] temp = null; try { temp = EncryptUtil.DES_CBC_Decrypt(encBuf, deskey, ivParam); } catch (Exception e) { e.printStackTrace(); } // 進行解密後的md5Hash校驗 byte[] md5Hash = null; try { md5Hash = EncryptUtil.MD5Hash(temp, 16, temp.length - 16); } catch (Exception e) { e.printStackTrace(); } // 進行解密校檢 for (int i = 0; i < md5Hash.length; i++) { if (md5Hash[i] != temp[i]) { // System.out.println(md5Hash[i] + "MD5校驗錯誤。" + temp[i]); throw new Exception("MD5校驗錯誤。"); } } // 返回解密後的陣列,其中前16MD5Hash碼要除去。 return new String(temp, 16, temp.length - 16, "utf-8"); } public static String decode(String str, String encoding){ String result = null; byte[] bt = null; try { sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder(); bt = decoder.decodeBuffer( str ); if (StringUtils.isEmpty(encoding)) { encoding = "UTF-8"; } result = new String(bt, encoding); } catch (IOException e) { e.printStackTrace(); } return result; } /** * <li> * 方法名稱:TripleDES_CBC_Encrypt</li> <li> * 功能描述: * 經過封裝的三重DES/CBC加密演算法,如果包含中文,請注意編碼。 * @param sourceBuf * 需要加密內容的位元組陣列。 * @param deskey * KEY 24位位元組陣列通過SecretKeySpec類轉換而成。 * @param ivParam * IV偏轉向量,由8位位元組陣列通過IvParameterSpec類轉換而成。 * @return 加密後的位元組陣列 * @throws Exception */ public static byte[] TripleDES_CBC_Encrypt(byte[] sourceBuf, SecretKeySpec deskey, IvParameterSpec ivParam) throws Exception { byte[] cipherByte; // 使用DES對稱加密演算法的CBC模式加密 Cipher encrypt = Cipher.getInstance("TripleDES/CBC/PKCS5Padding"); encrypt.init(Cipher.ENCRYPT_MODE, deskey, ivParam); cipherByte = encrypt.doFinal(sourceBuf, 0, sourceBuf.length); // 返回加密後的位元組陣列 return cipherByte; } /** * <li> * 方法名稱:TripleDES_CBC_Decrypt</li> <li> * 功能描述: * 經過封裝的三重DES / CBC解密演算法 * @param sourceBuf * 需要解密內容的位元組陣列 * @param deskey * KEY 24位位元組陣列通過SecretKeySpec類轉換而成。 * @param ivParam * IV偏轉向量,由6位位元組陣列通過IvParameterSpec類轉換而成。 * @return 解密後的位元組陣列 * @throws Exception */ public static byte[] TripleDES_CBC_Decrypt(byte[] sourceBuf, SecretKeySpec deskey, IvParameterSpec ivParam) throws Exception { byte[] cipherByte; // 獲得Cipher例項,使用CBC模式。 Cipher decrypt = Cipher.getInstance("TripleDES/CBC/PKCS5Padding"); // 初始化加密例項,定義為解密功能,並傳入金鑰,偏轉向量 decrypt.init(Cipher.DECRYPT_MODE, deskey, ivParam); cipherByte = decrypt.doFinal(sourceBuf, 0, sourceBuf.length); // 返回解密後的位元組陣列 return cipherByte; } /** * <li> * 方法名稱:DES_CBC_Encrypt</li> <li> * 功能描述: * 經過封裝的DES/CBC加密演算法,如果包含中文,請注意編碼。 * @param sourceBuf * 需要加密內容的位元組陣列。 * @param deskey * KEY 8位位元組陣列通過SecretKeySpec類轉換而成。 * @param ivParam * IV偏轉向量,由8位位元組陣列通過IvParameterSpec類轉換而成。 * @return 加密後的位元組陣列 * @throws Exception */ public static byte[] DES_CBC_Encrypt(byte[] sourceBuf, SecretKeySpec deskey, IvParameterSpec ivParam) throws Exception { byte[] cipherByte; // 使用DES對稱加密演算法的CBC模式加密 Cipher encrypt = Cipher.getInstance("DES/CBC/PKCS5Padding"); encrypt.init(Cipher.ENCRYPT_MODE, deskey, ivParam); cipherByte = encrypt.doFinal(sourceBuf, 0, sourceBuf.length); // 返回加密後的位元組陣列 return cipherByte; } /** * <li> * 方法名稱:DES_CBC_Decrypt</li> <li> * 功能描述: * 經過封裝的DES/CBC解密演算法。 * @param sourceBuf * 需要解密內容的位元組陣列 * @param deskey * KEY 8位位元組陣列通過SecretKeySpec類轉換而成。 * @param ivParam * IV偏轉向量,由6位位元組陣列通過IvParameterSpec類轉換而成。 * @return 解密後的位元組陣列 * @throws Exception */ public static byte[] DES_CBC_Decrypt(byte[] sourceBuf, SecretKeySpec deskey, IvParameterSpec ivParam) throws Exception { byte[] cipherByte; // 獲得Cipher例項,使用CBC模式。 Cipher decrypt = Cipher.getInstance("DES/CBC/PKCS5Padding"); // 初始化加密例項,定義為解密功能,並傳入金鑰,偏轉向量 decrypt.init(Cipher.DECRYPT_MODE, deskey, ivParam); cipherByte = decrypt.doFinal(sourceBuf, 0, sourceBuf.length); // 返回解密後的位元組陣列 return cipherByte; } /** * <li> * 方法名稱:MD5Hash</li> <li> * 功能描述: * * <pre> * MD5,進行了簡單的封裝,以適用於加,解密字串的校驗。 * @param buf * 需要MD5加密位元組陣列。 * @param offset * 加密資料起始位置。 * @param length * 需要加密的陣列長度。 * @return * @throws Exception */ public static byte[] MD5Hash(byte[] buf, int offset, int length) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buf, offset, length); return md.digest(); } /** * <li> * 方法名稱:byte2hex</li> <li> * 功能描述: * 位元組陣列轉換為二行製表示 * @param inStr * 需要轉換位元組陣列。 * @return 位元組陣列的二進位制表示。 */ public static String byte2hex(byte[] inStr) { String stmp; StringBuffer out = new StringBuffer(inStr.length * 2); for (int n = 0; n < inStr.length; n++) { // 位元組做""運算,去除高位置位元組 11111111 stmp = Integer.toHexString(inStr[n] & 0xFF); if (stmp.length() == 1) { // 如果是0F的單位字串,則新增0 out.append("0" + stmp); } else { out.append(stmp); } } return out.toString(); } /** * <li> * 方法名稱:addMD5</li> <li> * 功能描述: * <pre> * MD校驗碼 組合方法,前16位放MD5Hash碼。 把MD5驗證碼byte[],加密內容byte[]組合的方法。 * @param md5Byte * 加密內容的MD5Hash位元組陣列。 * @param bodyByte * 加密內容位元組陣列 * @return 組合後的位元組陣列,比加密內容長16個位元組。 */ public static byte[] addMD5(byte[] md5Byte, byte[] bodyByte) { int length = bodyByte.length + md5Byte.length; byte[] resutlByte = new byte[length]; // 16位放MD5Hashfor (int i = 0; i < length; i++) { if (i < md5Byte.length) { resutlByte[i] = md5Byte[i]; } else { resutlByte[i] = bodyByte[i - md5Byte.length]; } } return resutlByte; } /** * <li> * 方法名稱:getKeyIV</li> <li> * 功能描述: * @param encryptKey * @param key * @param iv */ public static void getKeyIV(String encryptKey, byte[] key, byte[] iv) { // 金鑰Base64解密 BASE64Decoder decoder = new BASE64Decoder(); byte[] buf = null; try { buf = decoder.decodeBuffer(encryptKey); } catch (IOException e) { e.printStackTrace(); } // 8位為key int i; for (i = 0; i < key.length; i++) { key[i] = buf[i]; } // 8位為iv向量 for (i = 0; i < iv.length; i++) { iv[i] = buf[i + 8]; } } }
MD5加密程式碼如下
package com.ig.common.util;
import org.apache.commons.lang3.StringUtils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
/**
 * Created by Terry on 2015/7/16.
 * MD5加密工具類
*/
public class MD5Util {

    private static final char DIGITS_LOWER[] = { '0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    private static final char DIGITS_UPPER[] = { '0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    private static final String DEFAULT_ENCODING = "UTF8";
    private static final String ALGORITH = "MD5";
    private static final MessageDigest md = getMessageDigest(ALGORITH);
/**
     * MD5(32位的十六進位制表示)
     *
     * @param srcStr
*            源字串
* @param encode
*            編碼方式
* @return
*/
public static String digest(String srcStr, String encode) {
        byte[] rstBytes;
        try {
            rstBytes = md.digest(srcStr.getBytes(encode));
} catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
}
        return toHex(rstBytes, true);
}

    /**
     * 預設使用UTF8編碼進行解析
*
     * @param srcStr
*            源字串
* @return
*/
public static String digest(String srcStr) {
        return digest(srcStr, DEFAULT_ENCODING);
}

    /**
     * 獲取摘要處理例項
*
     * @param algorithm
*            摘要的演算法
* @return
*/
private static MessageDigest getMessageDigest(String algorithm) {
        try {
            return MessageDigest.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
}
    }

    /**
     * 位元組碼轉十六進位制的字串
*
     * @param bytes
*            位元組陣列
* @param flag
*            大小寫標誌,true為小寫,false為大寫
* @return
*/
public static String toHex(byte[] bytes, boolean flag) {
        return new String(processBytes2Hex(bytes, flag ? DIGITS_LOWER : DIGITS_UPPER));
}

    /**
     * 將位元組陣列轉化為十六進位制字串
*
     * @param bytes
*            位元組陣列
* @param digits
*            數字加字母字元陣列
* @return
*/
private static char[] processBytes2Hex(byte[] bytes, char[] digits) {
        // bytes.length << 1肯定是32,左移1位是因為一個位元組是8位二進位制,一個十六進位制用4位二進位制表示
// 當然可以寫成l = 32,因為MD5生成的位元組陣列必定是長度為16的位元組陣列
int l = bytes.length << 1;
        char[] rstChars = new char[l];
        int j = 0;
        for (int i = 0; i < bytes.length; i++) {
            // 得到一個位元組中的高四位的值
rstChars[j++] = digits[(0xf0 & bytes[i]) >>> 4];
// 得到一個位元組中低四位的值
rstChars[j++] = digits[0x0f & bytes[i]];
}
        return rstChars;
}
    public static String encode(byte[] source) {
        String s = null;
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
md.update(source);
            byte tmp[] = md.digest();
            char str[] = new char[16 * 2];
            int k = 0;
            for (int i = 0; i < 16; i++) {
                byte byte0 = tmp[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
            s = new String(str);
} catch (Exception e) {
            e.printStackTrace();
}
        return s;
}