如何使用Scribe Online API和PHP使用AES / Cryptography加密文本

问题描述 投票:3回答:1

我正在使用Scribe Online API:https://dev.scribesoft.com/en/main/special_props/connection_properties.htm

他们对创建新连接时发送数据的加密要求有非常明确的说明,为方便起见,我在下面发布了这个连接。我正在使用PHP并努力让他们的API接受我的加密。到目前为止我的努力(在PHP中):

$props = [
    'Url' => 'www.web.com',
    'UserId' => '[email protected]',
    '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);

在我测试时,我会将结果复制并粘贴到他们的Swagger API资源管理器页面并运行测试但返回错误“遇到加密错误。请验证您的加密密钥并确保您遵循已发布的指南这个API。“ https://api.scribesoft.com/swagger/iframe#!/Connections/Connections_CreateConnection

在JSON中需要API调用以及其他一些不需要加密的参数 - 所以我发送类似这样的信息,其中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数据时,加密值必须是64位编码并附加到基本64位编码的随机初始化向量。

要加密Connection属性值:

1)将纯文本连接值转换为UTF-8编码。

2)生成一个16字节的随机数组。这是AES对称密钥算法的初始化向量(IV)。

3)使用基于密码的密钥派生函数2(PBKDF2)标准,使用基于密码的消息认证代码,使用标准加密算法1(HMAC)计算,从API访问令牌密钥和TIBCOScribe®API盐值生成1000次迭代派生密钥-sha1)。

4)使用密钥大小为256,块大小为128和PKCS7填充的AES算法加密UTF-8编码的Connection属性值。

5)将IV值和加密的Connection属性值转换为Base 64编码的文本字符串。

6)将Base 64加密的文本字符串附加到Base 64 IV文本字符串。

php cryptography aes tibco
1个回答
3
投票

好吧,我终于解决了这个小问题。发生了一些事情。

@Sven - 您建议将加密别名更改为显式帮助,例如AES-256-CBC代替AES256。

其次 - 在PHP函数中设置了几个额外的参数来使其工作。

我将OPENSSL_RAW_DATA添加到openssl_encrypt函数,即

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

我还必须在hash_pbkdf2函数上将密钥长度设置为256并将raw_output设置为TRUE(默认为false),即

$pbkdf2 = hash_pbkdf2('sha1', 'ORG_KEY', 'TIBCO_SALT_PUBLIC_KEY', 1000, 256, true);
© www.soinside.com 2019 - 2024. All rights reserved.