java常用的2中加密密碼方式MD5和Encrypt
阿新 • • 發佈:2019-02-12
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校驗錯誤。"); } } // 返回解密後的陣列,其中前16位MD5Hash碼要除去。 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) { // 如果是0至F的單位字串,則新增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位放MD5Hash碼 for (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; }