1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| package com.lyc.wwyt.config.convert;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.lyc.wwyt.exception.DecryptException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.util.StreamUtils;
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.ByteArrayInputStream; import java.io.IOException; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.Collections; import java.util.List; import java.util.Map;
public class DecryptingHttpMessageConverter extends MappingJackson2HttpMessageConverter { private static final String KEY = "xxxxxxxxxxxxxxxxx"; private static final String INITIALIZATION_VECTOR = "xxxxxxxxxxxxxxxxx";
private final ObjectMapper objectMapper;
public DecryptingHttpMessageConverter(ObjectMapper objectMapper) { super(objectMapper); this.objectMapper = objectMapper; setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON)); }
@Override public boolean canRead(Class<?> clazz, MediaType mediaType) { return true; }
@Override public Object read(Type type, Class<?> clazz, HttpInputMessage inputMessage) throws IOException { JavaType javaType = this.getJavaType(type, clazz); String body = StreamUtils.copyToString(inputMessage.getBody(), StandardCharsets.UTF_8); Map<String, Object> map = objectMapper.readValue(body, new TypeReference<Map<String, Object>>() { }); String encryptedDatas = (String) map.get("datas"); String decryptedDatas = decrypt(encryptedDatas); String decryptedBody; if (List.class.isAssignableFrom(javaType.getRawClass())) { List<Map<String, Object>> decryptedList = objectMapper.readValue(decryptedDatas, new TypeReference<List<Map<String, Object>>>() { }); decryptedBody = objectMapper.writeValueAsString(decryptedList); } else { Map<String, Object> decryptedMap = objectMapper.readValue(decryptedDatas, new TypeReference<Map<String, Object>>() { }); map.putAll(decryptedMap); map.remove("datas"); decryptedBody = objectMapper.writeValueAsString(map); }
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decryptedBody.getBytes()); HttpHeaders headers = inputMessage.getHeaders(); return this.objectMapper.readValue(byteArrayInputStream, javaType); }
private String decrypt(String encrypted) { try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec key = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), "AES"); IvParameterSpec iv = new IvParameterSpec(INITIALIZATION_VECTOR.getBytes(StandardCharsets.UTF_8)); cipher.init(Cipher.DECRYPT_MODE, key, iv); byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encrypted)); return new String(decrypted, StandardCharsets.UTF_8); } catch (Exception e) { throw new DecryptException(); } } }
|