js 加密
DES 舉例:
js 引入:
<script src="/js/plugins/crypto/crypto-js.js"></script>
<script src="/js/plugins/crypto/tripledes.js"></script>
加密函數:
function encryptByDES(value, key) { if(value == '') return ''; var keyHex = CryptoJS.enc.Utf8.parse(key); var encrypted = CryptoJS.DES.encrypt(value, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); }
Java服務端解密:
/** * {3DES加密解密的工具類 } */ public class DESUtils { private static final Logger logger = LoggerFactory.getLogger(DESUtils.class); //定義加密算法,有DES、DESede(即3DES)、Blowfish private static final String ALGORITHM = "DESede"; // 算法名稱/加密模式/填充方式 private static final String CIPHER_ALGORITHM_ECB = "DESede/ECB/PKCS5Padding"; private static Cipher cipher = null; private DESUtils(){} private static Cipher getCipher() throws NoSuchPaddingException, NoSuchAlgorithmException { if(cipher == null ){ cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB); } return cipher; } /** * 加密方法 * @param src * @param key * @return */ public static String encrypt(String src, String key, boolean hex) { try { SecretKey deskey = new SecretKeySpec(build3DesKey(key), ALGORITHM); //生成密鑰 Cipher c = getCipher(); //獲取Cipher工具類 c.init(Cipher.ENCRYPT_MODE, deskey); //初始化為加密模式 if(hex) { return bytesToHexString(c.doFinal(src.getBytes())); }else{ return Base64.getEncoder().encodeToString(c.doFinal(src.getBytes())); } } catch (Exception e) { logger.error("DES encrypt error: {}", e); } return StringUtils.EMPTY; } /** * byte數組轉換為16進制字符 * @param bArray * @return */ public static final String bytesToHexString(byte[] bArray) { StringBuilder sb = new StringBuilder(bArray.length); String sTemp; for (int i = 0; i < bArray.length; i++) { sTemp = Integer.toHexString(0xFF & bArray[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } /** * Base64解碼 * @param src * @return */ public static byte[] base64Decode(String src){ return Base64.getDecoder().decode(src); } /** * Convert hex string to byte[] * @param hexString the hex string * @return byte[] */ public static byte[] hexStringToBytes(String hexString) { if (hexString == null || "".equals(hexString)) { return new byte[0]; } hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } /** * char 轉換 byte * @param c char * @return byte */ private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } /** * 解密函數 * @param src 密文的字節數組 * @param key 密鑰 * @return */ public static byte[] decrypt(byte[] src, String key) { try { SecretKey deskey = new SecretKeySpec(build3DesKey(key), ALGORITHM); Cipher c = getCipher(); //獲取Cipher工具類 c.init(Cipher.DECRYPT_MODE, deskey); //初始化為解密模式 return c.doFinal(src); } catch (Exception e) { logger.error("DES decrypt error: {}", e); } return new byte[0]; } /** * 根據字符串生成密鑰字節數組 * @param keyStr 密鑰字符串 * @return * @throws UnsupportedEncodingException */ public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException { byte[] key = new byte[24]; //聲明一個24位的字節數組,默認里面都是0 byte[] temp = keyStr.getBytes("UTF-8"); //將字符串轉成字節數組 ///執行數組拷貝 if (key.length > temp.length) { //如果temp不夠24位,則拷貝temp數組整個長度的內容到key數組中 System.arraycopy(temp, 0, key, 0, temp.length); } else { //如果temp大於24位,則拷貝temp數組24個長度的內容到key數組中 System.arraycopy(temp, 0, key, 0, key.length); } return key; } public static String decryptToString(String src, String key) { if(StringUtils.isBlank(src) || StringUtils.isBlank(key)) return ""; byte[] decrypted = decrypt(Base64.getDecoder().decode(src), key); return decrypted != null?new String(decrypted):""; } public static void main(String[] args) throws Exception { System.out.println(decryptToString("L3qfqTIkBfwYexfp9F2+hQ==", Constants.LOGIN_ENCRYPT_KEY)); } }