当前位置: 首页 > 知识库问答 >
问题:

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

白永昌
2023-03-14

我正在使用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);

在测试期间,我将结果复制并粘贴到他们的Swagger API explorer页面,并运行测试,但返回错误“遇到加密错误。请验证您的加密密钥,并确保您遵守此API的发布准则。”https://api.scribesoft.com/swagger/iframe#!/连接/连接\u创建连接

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所接受的相同结果。

有人知道我哪里出错了吗?

当POST或PUT数据时,加密值必须是基64编码的,并附加到基64编码的随机初始化向量。

要加密Connection属性值:

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

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

3) 使用基于密码的密钥派生函数2(PBKDF2)标准,使用标准加密算法1(HMAC-SHA1)计算的基于散列的消息身份验证码,从API访问令牌密钥和TIBCO Scribe®API salt值生成1000次迭代派生密钥。

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

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

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

共有1个答案

谯嘉胜
2023-03-14

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

@sven-您建议将加密别名更改为显式,例如AES-256-CBC而不是AES256。

其次,在PHP函数中需要设置一些额外的参数来实现这一点。

我将OPENSSL_原始_数据添加到OPENSSL_加密函数中,即

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

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

$pbkdf2 = hash_pbkdf2('sha1', 'ORG_KEY', 'TIBCO_SALT_PUBLIC_KEY', 1000, 256, true);
 类似资料:
  • 在本节中,我们将回顾以下安全问题: 生成随机数据 加密和解密 确认数据完整性 生成伪随机数据(Generating Pseudorandom Data) 伪随机数据在很多情况下都很有用。 例如,当通过电子邮件重置密码时, 您需要生成一个令牌,将其保存到数据库中,并通过电子邮件发送给最终用户, 这反过来又会允许他们证明该帐户的所有权。 这个令牌是独一无二且难以猜测的,否则攻击者可能会预测令牌的值并重

  • null 我很困惑,我应该选择哪种方法?我不知道这两种方法的利弊。

  • 我试图在Android和PHP端使用AES加密/解密数据,并累犯空答案。 首先,我在Android中生成了对称密钥: 在服务器端,我试图解密数据。我可以解密(从RSA)秘密的AES密钥,并得到它的字符串表示。在客户端(Android)和服务器端(PHP)上是一样的。但是如何使用这个字符串AES密钥来解密数据呢?我尝试了这个(PHP): PHP中的结果: 怎么啦?

  • 本文向大家介绍如何在PHP中使用AES加密算法加密数据,包括了如何在PHP中使用AES加密算法加密数据的使用技巧和注意事项,需要的朋友参考一下 在研究Discuz 的时候,发现Discuz有一套相当完美的加密算法(相对而言)。这个算法可以将数据加密后,储存起来,到需要用的时候,用之前加密的秘钥将之还原。 除了这个之外,还有AES这个算法能够将数据很好的加密起来,在传输过程中不容易被破解。 在PHP

  • 我正在使用这样的代码来加密文件。 但是,尽管此代码成功加密。txt和。xml文件,它不适用于其他文件类型,例如。docx或图像文件格式。我可以对代码进行哪些更改以将功能扩展到所有此类文件类型?

  • 我正在尝试构建一个程序,该程序接收一个文件(任意大小的EXE),对其进行加密并将其复制到一个结构中。然后稍后对其进行解密,并确保其与使用时相同。 我有一个艰难的时间加密,然后解密文件。它似乎没有正确加密,我不知道如何测试它。 以下是我的问题: 我在这里做错了什么? 是否有更好的库使用AES加密?或者我应该坚持openSSL 让我们说我想用另一个键说“你好世界”。我能不能用这个字符串作为加密算法的参