Jmeter Шифрует AES 128 с CBC

Я хочу зашифровать текст, я использую шифрование AES с ключевыми и векторными переменными, и у меня есть следующий код:

import java.util.zip.GZIPOutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; 

log.info("Beanshell Execution Commenced"); 

String plainText = vars.get("xmlDeclaracion").toString();

//log.info(plainText); 

static final String _Key = vars.get("keybytes");
static final String _Iv = vars.get("iv");

Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec _KeySpec = new SecretKeySpec(_Key.getBytes(), "AES");
IvParameterSpec _IvSpec = new IvParameterSpec(_Iv.getBytes());

_Cipher.init(Cipher.ENCRYPT_MODE, _KeySpec, _IvSpec); 

byte[] cipherText = _Cipher.doFinal(plainText.getBytes("UTF-8")); 

String encryptedResponse = Base64.encodeBase64String(cipherText); 

vars.put("encryptedResponse",encryptedResponse); 

Но в консоли показывает ОШИБКУ Error invoking bsh method, когда я запускаю тест

2020-12-10 18:29:25,154 INFO o.a.j.e.StandardJMeterEngine: Running the test!
2020-12-10 18:29:25,154 INFO o.a.j.s.SampleEvent: List of sample_variables: []
2020-12-10 18:29:25,155 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, *local*)
2020-12-10 18:29:25,155 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : Thread Group
2020-12-10 18:29:25,155 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group Thread Group.
2020-12-10 18:29:25,155 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error
2020-12-10 18:29:25,155 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false
2020-12-10 18:29:25,160 INFO o.a.j.t.ThreadGroup: Started thread group number 1
2020-12-10 18:29:25,160 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2020-12-10 18:29:25,160 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-1
2020-12-10 18:29:25,160 INFO o.a.j.s.FileServer: Stored: C:/Jmeter/Morales2020/MoralesAnual.csv
2020-12-10 18:29:25,165 INFO o.a.j.u.BeanShellTestElement: Beanshell Execution Commenced
2020-12-10 18:29:25,166 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.util.zip.GZIPOutputStream; import java.security.InvalidAlgorithmPara . . . '' : Method Invocation _Cipher.init
2020-12-10 18:29:25,166 WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.util.zip.GZIPOutputStream; import java.security.InvalidAlgorithmPara . . . '' : Method Invocation _Cipher.init**
2020-12-10 18:29:25,166 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-1
2020-12-10 18:29:25,166 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-1
2020-12-10 18:29:25,167 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test
2020-12-10 18:29:25,167 INFO o.a.j.s.FileServer: Close: C:/Jmeter/Morales2020/MoralesAnual.csv
2020-12-10 18:29:25,167 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, *local*)

Вы пытаетесь зашифровать с помощью AES в режиме CBC, для которого требуется вектор инициализации (IV) ровно 16 байтов (это длина блока AES), но вы используете IV, взятый из строки длиной 2 символа [приведет к 2-байтовой длинной множество]. Попробуйте использовать строку из 16 символов. Во-вторых, то же самое для ключа шифрования - AES "128" определяется ключом длиной 128/8 = 16 байтов - также добавьте строку ключа. Предупреждение о безопасности. В приведенном выше коде используется фиксированный ключ и IV, что делает его НЕБЕЗОПАСНЫМ.

Michael Fehr 11.12.2020 08:19

Спасибо, Майкл, в этом случае мой IV был неправильным

Rodolfo David García 11.12.2020 20:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
569
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить удобочитаемые сообщения об ошибках, вам нужно поместить свой код в блок try, например:

try {
//your code here
}
catch (Exception ex) {
    log.error("Failure", ex);
}

Также имейте в виду, что начиная с JMeter 3.1 рекомендуется использовать тестовые элементы JSR223 и язык Groovy для сценариев. Groovy имеет гораздо лучшую производительность по сравнению с Beanshell, особенно когда речь идет о ресурсоемких криптографических операциях.

Единственным необходимым изменением в вашем коде будет удаление статических модификаторов из переменных.

Итак, если ваши переменные xmlDeclaracion, keybytes и iv имеют допустимые значения, ваш код должен работать нормально.

Дополнительная информация о сценариях Groovy в JMeter: Apache Groovy — почему и как вы должны его использовать

Спасибо @Dmitri T, эти строки помогли мне точно определить ошибку.

Rodolfo David García 11.12.2020 20:30

Другие вопросы по теме