Результат дешифрования не соответствует - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть два экземпляра моего сервиса, который выполняет шифрование и дешифрование в облаке.Расшифровка иногда завершается с ошибкой «расшифровка не удалась».Я предполагаю, что это потому, что каждый экземпляр имеет свой собственный экземпляр Aead.Как я могу решить эту проблему?

    public class Utils {
        private static final Logger log = LoggerFactory.getLogger(Utils.class);
        private Aead aead;
        private static Utils utils;

        private Utils() {
            try {
                AeadConfig.register();
                KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);
                aead = AeadFactory.getPrimitive(keysetHandle);
            } catch (GeneralSecurityException e) {
                log.error(String.format("Error occured: %s",e.getMessage())).log();
            }
        }

        public static Utils getInstance() {
            if(null == utils) {
                utils = new Utils();
            }
        return utils;
    }

    public String encrypt(String text) throws GeneralSecurityException, UnsupportedEncodingException {
        byte[] plainText = text.getBytes("ISO-8859-1");
        byte[] additionalData = null;
        byte[] cipherText = aead.encrypt(plainText,additionalData);

        String output = Base64.getEncoder().encodeToString(cipherText);
        return output;
    }

    public String decrypt(String text) throws GeneralSecurityException, UnsupportedEncodingException {
        byte[] cipherText = Base64.getDecoder().decode(text);
        byte[] additionalData = null;
        byte[] decipheredData = aead.decrypt(cipherText,additionalData);

        String output = new String(decipheredData,"ISO-8859-1");
        return output;
    }

 @Test
    public void encrypt() throws IOException, GeneralSecurityException {
        String encryptedText = cryptographicUtils.encrypt("Hello World");
        assertThat(encryptedText, Matchers.notNullValue());
    }

    @Test
    public void decrypt() throws IOException, GeneralSecurityException {
        String encryptedText = cryptographicUtils.encrypt("Hello 123456");
        String decrypedText = cryptographicUtils.decrypt(encryptedText);

        assertThat(decrypedText, Matchers.is("Hello 123456"));
    }

Я получаю согласованный результат, если запущен только один экземпляр ...

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Мне придется использовать один и тот же набор ключей для шифрования и дешифрования. Я могу решить эту проблему, храня набор ключей в физическом месте и используя его для создания экземпляра Aead. С этим изменением все экземпляры моего сервиса смогли успешно расшифровать строку

0 голосов
/ 15 апреля 2019

Похоже на проблему безопасности потока.Попробуйте сделать синхронизацию getInstance.Кроме того, защитите доступ к частному Aead Aead

Несколько потоков могут изменить состояние AEAD, если вы не будете осторожны.

Рассмотрите очередь для выполнения вашей работы,или синхронизировать доступ к тому, что взаимодействует с aead.

...