#java #tink
#java #tink
Вопрос:
У меня есть два экземпляра моей службы, которые выполняют шифрование и дешифрование, работающие в облаке. Иногда происходит сбой дешифрования с ошибкой ‘decryption failed’. Я думаю, это потому, что у каждого экземпляра есть свой собственный экземпляр 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"));
}
Я получаю согласованный результат, если запущен только один экземпляр…
Ответ №1:
Мне придется использовать один и тот же набор ключей для шифрования и дешифрования. Я могу решить проблему, сохранив набор ключей в физическом местоположении и используя его для создания экземпляра Aead. С этим изменением все экземпляры моей службы могут успешно расшифровать строку
Ответ №2:
Похоже на проблему потокобезопасности. Попробуйте синхронизировать getInstance. Кроме того, защитите доступ к закрытому Aead aead
Несколько потоков могут изменять состояние aead, если вы не будете осторожны.
Рассмотрите возможность создания очереди для выполнения вашей работы или синхронизации доступа к тому, что взаимодействует с aead.