access token 加密传输
当客户需要用到 access token 方式的「加密模式」时,需要客户在接口中对 access token 使用工具类进行加密后返回,并且在微信授权管理页面上填入对应的 AESKey。
AESKey 为客户自定义,加密时的 AESKey 与配置页上的 AESKey 需要保持一致,要求为16位字符。
java 工具类示例
@Slf4j
@UtilityClass
public class CryptoUtil {
private static final String SENSORSDATA_IV = "ab3456ha89012346";
private static final String CHAR_SET = "UTF-8";
private static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding";
private static final int KEY_LENGTH = 16;
public static String decryptAES(String content,String key) {
try {
String aesKey = getAESKey(key);
SecretKeySpec secretkeySpec = new SecretKeySpec(aesKey.getBytes(CHAR_SET), "AES");
Cipher cipher = Cipher.getInstance(AES_CBC_PADDING);
IvParameterSpec ivSpec = new IvParameterSpec(SENSORSDATA_IV.getBytes(CHAR_SET));
cipher.init(Cipher.DECRYPT_MODE, secretkeySpec,ivSpec);
byte[] base = Base64.decodeBase64(content.getBytes(CHAR_SET));
byte[] res = cipher.doFinal(base);
return new String(res,CHAR_SET);
} catch (Exception e) {
log.error("decryptAES Exception:", e);
}
return null;
}
public static String encryptAES(String content, String key) {
try {
String aesKey = getAESKey(key);
Cipher cipher = Cipher.getInstance(AES_CBC_PADDING);
SecretKeySpec secretKey = new SecretKeySpec(aesKey.getBytes(CHAR_SET), "AES");
cipher.init(1, secretKey, new IvParameterSpec(SENSORSDATA_IV.getBytes(CHAR_SET))); // NOSONAR
return java.util.Base64.getEncoder().encodeToString(cipher.doFinal(content.getBytes(CHAR_SET)));
} catch (Exception e) {
log.error("encryptAES Exception:", e);
}
return null;
}
private static String getAESKey(String key) {
String secretKey;
if(StringUtils.isEmpty(key)){
return "";
}
int length = key.length();
if (length >= KEY_LENGTH){
secretKey = key.substring(0,KEY_LENGTH);
} else {
secretKey = String.format("%16s", key).replace(" ", "0");
}
return secretKey;
}
}