Как зашифровать текст с помощью AES / Cryptography с Scribe Online API и PHP - PullRequest
3 голосов
/ 23 марта 2019

Я работаю с Scribe Online API: https://dev.scribesoft.com/en/main/special_props/connection_properties.htm

У них очень четкие инструкции относительно требований к шифрованию для отправки данных при создании нового соединения, которые я выложил ниже для удобства. Я использую PHP и пытаюсь заставить их API принять мое шифрование. Мои усилия до сих пор (в PHP):

$props = [
    'Url' => 'www.web.com',
    'UserId' => 'abc123@hotmail.co.uk',
    'Password' => 'abc123',
    'SecurityToken' => '123',
    'UseBulkApiRS' => 'false',
    'UseBulkApiSYS' => 'false',
    'RefreshMetaDataUponReconnect' => 'false',
   'IncludeDeletedItemsSYS' => 'false',
];

$connector_props['connectorId'] = '8ADD76FC-525F-4B4B-B79E-945A6A762792';
$connector_props['connectorType'] = 'Salesforce';
$connector_props['color'] = '#FF00B050'; //Still Required but deprecated for Scribe Online.
$connector_props['name'] = 'Salesforce_TEST';
$connector_props['alias'] = 'Salesforce_TEST';

foreach($props as $prop_name => $val) {

    //$iv = openssl_random_pseudo_bytes(16);
    $iv = random_bytes(16);
    $pbkdf2 = hash_pbkdf2('sha1', 'ORG_KEY', 'TIBCO_SALT_PUBLIC_KEY', 1000);
    $aes = openssl_encrypt($val, 'AES-256-CBC', $pbkdf2, $options=0, $iv);
    $base64_iv = base64_encode($iv);
    $base64_val = base64_encode($aes);

    $connector_props['properties'][] = [
       'key' => $prop_name,
       'value' => $base64_iv.$base64_val,
    ];
 }
echo json_encode($connector_props, JSON_PRETTY_PRINT);

Во время тестирования я затем копирую и вставляю результат на их страницу обозревателя API Swagger и запускаю тест, но получаю сообщение об ошибке "Обнаружена криптографическая ошибка. Пожалуйста, проверьте свой криптографический ключ и убедитесь, что вы следуют опубликованным правилам для этого API. " https://api.scribesoft.com/swagger/iframe#!/Connections/Connections_CreateConnection

Ожидается вызов API в JSON вместе с некоторыми другими параметрами, которые не нужно шифровать, поэтому я отправляю что-то вроде этого, где XXX - это зашифрованное значение сверху:

{
    "name": "Salesforce 4.0",
    "alias": "Salesforce 4",
    "color": "#FF00B050",
    "connectorId": "8add76fc-525f-4b4b-b79e-945a6a762792",
    "connectorType": "Salesforce",
    "properties": [
      {
        "key": "Url",
        "value": "XXX"
      },
      {
        "key": "UserId",
        "value": "XXX"
      },
      {
        "key": "Password",
        "value": "XXX"
      },
      {
        "key": "SecurityToken",
        "value": "XXX"
      },
      {
        "key": "UseBulkApiRS",
        "value": "XXX"
      },
      {
        "key": "UseBulkApiSYS",
        "value": "XXX"
      },
      {
        "key": "RefreshMetaDataUponReconnect",
        "value": "XXX"
      },
      {
        "key": "IncludeDeletedItemsSYS",
        "value": "XXX"
      },
    ],
  }

У них есть пример Javascript: https://gitlab.com/ScribeSoftware/webapi-full-reference-app/blob/master/app/Encryption.js,, но я не совсем понимаю, как полностью преобразовать это в PHP и получить те же результаты, которые принимает API.

Кто-нибудь знает, где я иду не так, пожалуйста?

ИЗ API DOCS - Операции POST и PUT

Когда вы отправляете POST или PUT данные, зашифрованное значение должно быть зашифровано в base 64 и добавлено к вектору случайной инициализации в кодировке base 64.

Чтобы зашифровать значение свойства Connection:

1) Преобразовать текстовое значение соединения в кодировку UTF-8.

2) Создать случайный массив из 16 байтов. Это вектор инициализации (IV) для алгоритма симметричного ключа AES.

3) Создание 1000-итерационного ключа на основе ключа токена API и значения API TIBCO Scribe® с использованием стандарта функции определения ключа на основе пароля 2 (PBKDF2) с использованием кода аутентификации сообщений на основе хэша, рассчитанного с использованием стандартного алгоритма шифрования 1 (HMAC-SHA1).

4) Зашифруйте значение свойства Соединения в кодировке UTF-8 с помощью алгоритма AES, используя размер ключа 256, размер блока 128 и заполнение PKCS7.

5) Преобразовать значение IV и значение свойства зашифрованного соединения в текстовые строки в кодировке Base 64.

6) Добавьте текстовую строку, зашифрованную с помощью Base 64, к текстовой строке Base 64 IV.

1 Ответ

3 голосов
/ 23 марта 2019

Хорошо, я наконец справился с этой маленькой головной болью. Происходило несколько вещей.

@ Свен - помогло ваше предложение изменить псевдоним шифрования, например, чтобы оно было явным. AES-256-CBC вместо AES256.

Во-вторых, в функциях PHP было несколько дополнительных параметров, чтобы это работало.

Я добавил OPENSSL_RAW_DATA в функцию openssl_encrypt, т.е.

$aes = openssl_encrypt($val, 'AES-256-CBC', $pbkdf2, OPENSSL_RAW_DATA, $iv);

Мне также пришлось установить длину ключа равной 256, а raw_output - TRUE (по умолчанию false) в функции hash_pbkdf2, т.е.

$pbkdf2 = hash_pbkdf2('sha1', 'ORG_KEY', 'TIBCO_SALT_PUBLIC_KEY', 1000, 256, true);
...