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出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好?
解决办法
将这些字符转化成服务器可以识别的字符,对应关系如下:
URL字符转义
用其它字符替代吧,或用全角的。
+ URL 中+号表示空格 %2B
空格 URL中的空格可以用+号或者编码 %20
/ 分隔目录和子目录 %2F
? 分隔实际的URL和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3D