使用RSA+AES混合加密传输数据的时候,这是request请求时对入参的处理:
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
try {
RsaType type = RsaType.NONE;
if (methodParameter.getMethod().isAnnotationPresent(RsaSecurityParameter.class)) {
//获取注解配置的包含和去除字段
RsaSecurityParameter serializedField = methodParameter.getMethodAnnotation(RsaSecurityParameter.class);
//入参是否需要解密
type =serializedField.type();
}
if (type.equals(RsaType.ALL) || type.equals(RsaType.ONLY_DECODE)) {
String aesKey = "";
HttpHeaders headers = inputMessage.getHeaders();
if(headers.containsKey("Aes-Key")){
List<String> aesKeys = headers.get("Aes-Key");
if(aesKeys.size() == 1){
aesKey = aesKeys.get(0);
}
}
if(StringUtils.isEmpty(aesKey)){
throw new Exception();
}
String encrptAesKey = RSAUtils.decryptDataOnJava(aesKey,PRIVATE_KEY);
//需要解密
return new MyHttpInputMessage(inputMessage,encrptAesKey);
}else{
return inputMessage;
}
} catch (Exception e) {
e.printStackTrace();
return inputMessage;
}
}
这是响应时的处理:
public T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
try {
RsaType type = RsaType.NONE;
if (returnType.getMethod().isAnnotationPresent(RsaSecurityParameter.class)) {
//获取注解配置的包含和去除字段
RsaSecurityParameter serializedField = returnType.getMethodAnnotation(RsaSecurityParameter.class);
//出参是否需要加密
type =serializedField.type();
}
if (type.equals(RsaType.ALL) || type.equals(RsaType.ONLY_ENCODE)) {
//需要加密
String aesKey = "";
HttpHeaders headers = request.getHeaders();
if(headers.containsKey("Aes-Key")){
List<String> aesKeys = headers.get("Aes-Key");
if(aesKeys.size() == 1){
aesKey = aesKeys.get(0);
}
}
if(StringUtils.isEmpty(aesKey)){
throw new Exception();
}
String encrptAesKey = RSAUtils.decryptDataOnJava(aesKey,PRIVATE_KEY);
//使用aesKey加密响应数据
return (T) AESUtils.aesEncrypt(JSON.toJSONString(body), encrptAesKey);
}else{
return body;
}
} catch (Exception e) {
e.printStackTrace();
return body;
}
}
这两块代码,关于从请求头取出用RSA加密处理后的Aes-Key是一致的。DEBUG打断点观察取到的数据也是一致的,但是在使用RSA解密时,入参的解密是正常没问题的。出参这一块的解密就报javax.crypto.BadPaddingException: Decryption error这个错误。
这是入参时候的处理,这边aes-key是正常解密出来了的。
这是出参时候的处理,这边aes-key解密就报错了。
包括我在本地调用测试方法也是正常解密的不会报错的。
有没有大神帮忙解释一下?