Возникла проблема при расшифровке зашифрованных данных logstash в ES - PullRequest
1 голос
/ 13 июня 2019

Я шифрую некоторые данные с использованием фильтра шифрования logstash и сохраняю зашифрованные данные вasticsearch.Фрагмент кода, используемый для шифрования, выглядит следующим образом:

filter {
cipher {
algorithm => "aes-256-cbc"
cipher_padding => 1
iv_random_length => 16
key => "<32_DIGITS_KEY>"
key_size => 32
mode => "encrypt"
source => "[message]"
target => "[message_enc]"
}
}

Когда я читаю данные из этого индекса эластичного поиска с использованием кода Java и дешифрую их, я получаю такую ​​же случайную строку в Unicode перед моими фактическими данными.Пример случайной строки: «r��1�> <��B9c�M ****» </p>

Я не нашел ничего в своем коде для решения этой проблемы.

Пожалуйста, помогитеЯ в решении этого.

@ gusto2

Java-код для расшифровки данных выглядит следующим образом:

private static final String secretKey = "<32_DIGITS_KEY(SAME-AS-USED-IN-ENCRYPTION)>";
static String encrypt ;
//@PostConstruct
public static String encrypt(String strToEncrypt , byte[] salt)
{
    try
    {
        IvParameterSpec ivspec = new IvParameterSpec(salt);

        SecretKeySpec speckKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, speckKey , ivspec);
        byte[] encrypted = cipher.doFinal(strToEncrypt.getBytes());
        return Base64.encodeBase64String(encrypted);
    }
    catch (Exception e)
    {
        System.out.println("Error while encrypting: " + e.toString());
    }
    return null;
}

public static String decrypt(String encrypted ,byte[] salt) {
    try {
        IvParameterSpec ivspec = new IvParameterSpec(salt);

        SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, keySpec , ivspec);
        //return new String(cipher.doFinal(Base64.getDecoder().decode(encrypted)));
        byte[] original =  cipher.doFinal(Base64.decodeBase64(encrypted));

        return new String(original);
    } catch (Exception ex) {
                    ex.printStackTrace();
    }

    return null;
}

public  static void main (String args[]){
    byte[] IV = new byte[16];
    SecureRandom random = new SecureRandom();
    random.nextBytes(IV);
    final byte[] salt = IV;
    String strToEncrypt = "533032715323";
    encrypt = encrypt(strToEncrypt , salt);
    //encrypt = "w7oA8EdWmFNfBSUX1ZM0ixYU1Zep6tOnqz8b81X24n8=";
    System.out.println(encrypt);
    String decrpytStr = decrypt(encrypt , salt);
    System.out.println(decrpytStr);
    System.out.println(decrpytStr.equalsIgnoreCase(strToEncrypt));
}

1 Ответ

1 голос
/ 14 июня 2019

Я получаю ту же случайную строку в юникоде перед моими фактическими данными

Посмотрев, как работает фильтр шифров , вывод будет в виде Base64( iv + plaintext)

Длина соли совпадает с долей «iv_random_length» - 16. & случайная строка размера соли 16.

При использовании режима CBC эффекту вас случается, когда IV неверен.

Вопросы в комментариях были предназначены для того, чтобы вы поняли, что вы расшифровываете.При расшифровке соль не случайна.В данном случае это первые 16 байтов зашифрованного текста.Итак, вы должны взять первые 16 байтов, использовать их как IV и расшифровать остальные.

   byte[] decodedCiphertext = Base64.getDecoder().decode(encrypted);
   IvParameterSpec ivspec = new IvParameterSpec(decodedCiphertext, 0, 16);
   ...
   byte[] original =  cipher.doFinal(decodedCiphertext, 16, decodedCiphertext.length);
...