2016-11-22 6 views
8

В нашем приложении мы должны зашифровать/дешифровать значения свойства Json (а не имя свойства) для каждого запроса и ответа. Пример ,
{"userName":"encrypted value", "email":"encrypted value"}Spring Boot - Шифрование данных JSON

Мы используем Sprint загрузки 1.3, и мы используем @RequestBody и @ResponseBody аннотаций, чтобы связать запрос JSON с объектом и сериализация объект ответа как JSON.

Мы не делаем хотите вызвать метод шифрования/дешифрования в каждом нашем методе контроллера. Можно ли каким-либо образом проинструктировать sprint расшифровать значения json до привязки к объекту запроса? Аналогично, чтобы зашифровать значения поля объекта ответа перед их преобразованием в json? Или настройка Джексона может помочь нам?

Спасибо!

+0

Создание пользовательского клиента и сделать его там до вызова службы .. – johnnynemonic

+0

Что о реализации расшифровывать в добытчика и шифрования в инкубаторе? –

+1

Не вломился бы или расширил AbstractJackson2HttpMessageConverter более конкретным, так как здесь создан ответ json, а последний пункт перед его покраснением? – bigbadmouse

ответ

8

Вы можете написать собственный конвертер сообщений http. Так как вы используете весеннюю загрузку, это будет довольно просто: просто добавьте свой пользовательский конвертер от AbstractHttpMessageConverter и отметьте класс аннотацией @Component.

От spring docs:

Вы можете вносить дополнительные конвертеры, просто добавив бобы этого типа в контексте Spring загрузки. Если компонент, который вы добавляете, имеет тип, который был бы включен по умолчанию в любом случае (например, MappingJackson2HttpMessageConverter для конверсий JSON), то он заменит значение по умолчанию.

А вот простой пример:

@Component 
public class Converter extends AbstractHttpMessageConverter<Object> { 

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 

    @Inject 
    private ObjectMapper objectMapper; 

    public Converter(){ 
     super(MediaType.APPLICATION_JSON_UTF8, 
      new MediaType("application", "*+json", DEFAULT_CHARSET)); 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
     return true; 
    } 

    @Override 
    protected Object readInternal(Class<? extends Object> clazz, 
            HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
     return objectMapper.readValue(decrypt(inputMessage.getBody()), clazz); 
    } 

    @Override 
    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 
     outputMessage.getBody().write(encrypt(objectMapper.writeValueAsBytes(o))); 
    } 

    private InputStream decrypt(InputStream inputStream){ 
     // do your decryption here 
     return inputStream; 
    } 

    private byte[] encrypt(byte[] bytesToEncrypt){ 
     // do your encryption here 
     return bytesToEncrypt; 
    } 
} 
+0

Это будет работать, если весь json зашифрован. Но в нашем случае будут зашифрованы только значения свойств json. – Raj

+0

Вам решать, как реализовать методы 'encrypt' и' decrypt'. Я думаю, вы можете использовать 'JsonNode' для повторения всех значений json-объекта для их шифрования/дешифрования. – eparvan

+0

Спасибо, что работает! – Raj

Смежные вопросы