Хэшировать и кодировать переменную перед отправкой вместе с запросом

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

Я создал переменную, определяемую пользователем, которая содержит информацию для аутентификации в виде простого текста.
Перед вызовом первого HTTP-запроса мне нужно хешировать пароль с помощью SHA256, закодировать его с помощью base64, а затем преобразовать в верхний регистр.

Я получу auth_token в теле ответа в формате JSON. Затем мне нужно сделать ту же цепочку SHA256 -> base64 -> uppercase с этим auth_token, и с этого момента он будет использоваться в заголовке запроса.


person Mike LP    schedule 06.02.2013    source источник


Ответы (2)


  1. Если вы не реализуете критически важные для ресурсов сценарии (нагрузочное тестирование), вы можете использовать, например. Семплер JSR223 / Постпроцессор JSR223 / JSR223 PreProcessor с небольшим количеством кода.

    E.g.

    • Use JSR223 Sampler / PostProcessor / PreProcessor with the following [groovy] code:
    import java.security.MessageDigest;
    import org.apache.commons.codec.binary.Base64;
    import org.testng.annotations.Test;
    
    String [] params = Parameters.split(",");
    
    String text = params[0];
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    
    md.update(text.getBytes("UTF-8"));
    byte[] digest = md.digest();
    
    byte[] encoded = Base64.encodeBase64(digest);
    String encText = (new String(encoded)).toUpperCase();
    
    vars.put("encodedValue",encText);
    
    • Вы можете повторно использовать этот сэмплер как для хеширования пароля, так и для auth_token — через поле «Параметры» в конфигурации сэмплера JSR223: используйте, например, переменная ${password} в первом случае и auth_token во втором.

    • Хэшированное значение, на которое вы можете ссылаться как ${encodedValue} переменная.

  2. Аналогичный код groovy используется с функцией __groovy.

  3. Набор jmeter-plugins содержит ${__MD5(...)}, ${__base64Encode(...)}, ${__uppercase(...)} functions, но этого недостаточно для вашего случая (нет дайджеста SHA256).

  4. Вы также можете воспользоваться образцом процесса ОС, чтобы реализовать то же самое с помощью вашей ОС ( хорошо, если линукс) возможности.

person Aliaksandr Belik    schedule 06.02.2013
comment
Я смог немного упростить его, используя vars.put(passwordHash, Base64.encodeBase64String(digest).toUpperCase()); - person Mike LP; 06.02.2013
comment
Только потому, что я нашел это сейчас, и мне нужны были аналогичные функции. JMeter поставляется с файлом commons-codec.jar в пути к библиотеке. Так что вы можете использовать это и в BeanShell :) - person user432024; 28.11.2013

Появилась новая функция __digest, которая сейчас находится в ночных сборках

В вашем случае для сохранения в переменной encodedValue результата переменной пароля используйте следующее:

${__digest(SHA-256,${password},,,encodedValue)}

Вы можете загрузить плагин Custom JMeter Functions для вызова функции кодирования base 64. :

${__base64Encode(encodedValue, base64Value)}

А затем вызовите функцию верхнего регистра:

${__uppercase(base64Value, finalValue)}

${finalValue} будет содержать окончательное значение этой операции

person user7294900    schedule 15.11.2017
comment
Когда я запускаю это в jmeter, выдается ошибка при попытке установить свойство в файле сценария с именем (значение хеша): ${__digest(SHA-256,${password},,,encodedValue)} - person ssmith; 23.10.2019
comment
javax.script.ScriptException: groovy.lang.MissingPropertyException: Нет такого свойства: baa5f05689d39412e59913c3b514c459d8fa211d696b19322f0ac57334eaf19 для класса: Script64 - person ssmith; 23.10.2019