package com.lock.demo.service; import org.apache.tomcat.util.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * @author niunafei * @function * des 對稱性算法加密 解密工具類 可逆性算法 * @email niunafei0315@163.com * @date 2018/12/12 下午2:05 */ public class DesUtils { private static final String DES="DES"; /** * 公鑰 8位以上 */ private static final String SECRET_KEY="12345678"; /** * 獲取秘鑰對象 * @return * @throws Exception */ private static final SecretKey getSecretKeyFactory() throws Exception { SecretKeyFactory des = SecretKeyFactory.getInstance(DES); SecretKey secretKey = des.generateSecret(new DESKeySpec(SECRET_KEY.getBytes())); return secretKey; } /** * 加密 * @param param * @return * @throws Exception */ public static final String encryption(String param) throws Exception { Cipher cipher = Cipher.getInstance(DES); SecretKey secretKey = getSecretKeyFactory(); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return new String(Base64.encodeBase64(cipher.doFinal(param.toString().getBytes()))); } /** * 解密 * @param value * @return * @throws Exception */ public static final String decrypt(String value) throws Exception { Cipher cipher = Cipher.getInstance(DES); SecretKey secretKey = getSecretKeyFactory(); cipher.init(Cipher.DECRYPT_MODE, secretKey); return new String(cipher.doFinal(Base64.decodeBase64(value.getBytes()))); } /** 測試 */ public static void main(String[] args) throws Exception { String key="123"; System.out.println(" key="+key); //輸出 key=123 String value=DesUtils.encryption(key); System.out.println("encryption value="+value); //輸出 encryption value=LDiFUdf0iew= System.out.println("decrypt key="+DesUtils.decrypt(value)); //輸出 decrypt key=123 } }
以上為des 加密算法
以下為aes 可逆性加密算法
package com.lock.demo.service; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** * @author niunafei * @function * @email niunafei0315@163.com * @date 2018/12/12 下午2:32 */ public class AESUtils { private static final String AES="AES"; private static final String CHAR_SET_NAME1="UTF-8"; private static final String CHAR_SET_NAME2="ASCII"; private static final String CIPHER_KEY="AES/CBC/PKCS5Padding"; /** * 加密用的Key 可以用26個字母和數字組成 此處使用AES-128-CBC加密模式,key需要為16位。 */ private static final String IV_PARAMETER="a0.l954b_107x90l"; /** * 可以用26個字母和數字組成 此處使用AES-128-CBC加密模式,需要為16位。 */ private static final String S_KEY="ax7x90.3k_10li5u"; /** * 加密 * @param param * @return * @throws Exception */ public static String encryption(String param) throws Exception { Cipher cipher= Cipher.getInstance(CIPHER_KEY); SecretKeySpec skeySpec = new SecretKeySpec(S_KEY.getBytes(), AES); // 使用CBC模式,需要一個向量iv,可增加加密算法的強度 IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); // 此處使用BASE64做轉碼。 return new BASE64Encoder().encode(cipher.doFinal(param.getBytes(CHAR_SET_NAME1))); } /** * 解密 * @param value * @return * @throws Exception */ public static String decrypt(String value) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(S_KEY.getBytes(CHAR_SET_NAME2), AES); Cipher cipher = Cipher.getInstance(CIPHER_KEY); IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); // 先用base64解密 return new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(value)), CHAR_SET_NAME1); } /** 測試 */ public static void main(String[] args) throws Exception { String key="123"; System.out.println("key="+key); //輸出 key=123 String value=AESUtils.encryption(key); System.out.println("encryption value="+value); //輸出 encryption value=OTslJ40Fa9a7ImOmCbmLPw== System.out.println("decrypt key="+AESUtils.decrypt(value)); //輸出 decrypt key=123 } }
加密結果適用於url參數。 請使用異或可逆性算法 或者使用
URLEncoder.encode();
URLDecoder.decode() 進行轉碼即可
url出現了有+,空格,/,?,%,#,&,=等特殊符號的時候,可能在服務器端無法獲得正確的參數值,如何是好?
解決辦法
將這些字符轉化成服務器可以識別的字符,對應關系如下:
URL字符轉義
用其它字符替代吧,或用全角的。
+ URL 中+號表示空格 %2B
空格 URL中的空格可以用+號或者編碼 %20
/ 分隔目錄和子目錄 %2F
? 分隔實際的URL和參數 %3F
% 指定特殊字符 %25
# 表示書簽 %23
& URL 中指定的參數間的分隔符 %26
= URL 中指定參數的值 %3D