代码之家  ›  专栏  ›  技术社区  ›  Sampgun

crypto-js-AES与Salesforce的交换

  •  0
  • Sampgun  · 技术社区  · 1 年前

    我正在尝试使用crypto-js来管理来自营销云(AMPScript)的数据的加密和解密。 我在网上查看了库文档和一些“指南”。lib文档不讨论使用IV,而其他指南则非常混乱。 我最初尝试使用一个简单的加密-解密流程,但似乎无法正确执行。解密后的值始终为空。

    现在多亏了Topaco,我把密钥改为12个字符长,现在我可以加密/解密了。

    我还必须稍微调整一下解密部分,传递一个密码对象。

    我需要与他们核实他们是如何准确地使用参数的,以及他们是否正在进行多次加密以处理他们的样本数据。我会更新这个问题。

    这是我的密码。

    const key = enc.Utf8.parse('Harold%Finch');
    const iv = enc.Utf8.parse('11111111111111111111111111111111');
    const secret = enc.Utf8.parse('[email protected]');
    const encrypted = AES.encrypt(secret, key, {
      iv: iv,
      mode: mode.CBC,
      padding: pad.Pkcs7,
    });
    
    const encryptedString = encrypted.toString();
    // "2VxmNeqlTolVpgHrk+tdEO3+xS8XOjClikUjB+zAGis="
    
    // Convert the base64-encoded string to a CipherParams object
    const ciphertext = enc.Base64.parse(encryptedString);
    const cipherParams = lib.CipherParams.create({ ciphertext });
    
    const decrypted = AES.decrypt(cipherParams, key, {
      iv: iv,
      mode: mode.CBC,
      padding: pad.Pkcs7,
    });
    
    // Convert the decrypted data to a string (UTF-8)
    const decryptedString = decrypted.toString(enc.Utf8);
    
    console.info('decrypted', decryptedString);
    // "[email protected]"
    
    

    在他们的一端,代码看起来像:

    set @encAES = EncryptSymmetric(@str, "aes", @null, @password, @null, @salt, @null, @initVector)
    

    但我仍然没有得到同样的结果。 我正在查看此文档,以了解它是如何在默认值方面精确工作的(例如填充)

    https://ampscript.guide/encryptsymmetric/

    闪电战 here

    0 回复  |  直到 1 年前
        1
  •  0
  •   Sampgun    1 年前

    好的,看起来在引擎盖下面 EncryptSymmetric 中的方法 AMPScript 从创建密钥 password salt ,使用 PBKDF2 密钥推导(如@Topaco所述)。

    所以我们也需要这样做。 我正在使用 crypto-js 因为我有一组在前端和边缘中间件之间共享的编码-解码功能,但如果您在后端,则可以使用 出生地的 crypto 的实施 节点 .

    原始AMPScript代码:

      %%[ 
        set @str = [EmailAddress]
        set @password="xyQ8n55tKi$@@4dy"
        set @initVector='198e3f0733ec4791'
        set @salt = "c2dc41eeab1e513a"  
    
        set @encAES = EncryptSymmetric(@str, "aes", @null, @password, @null, @salt, @null, @initVector)
        set @decAES = DecryptSymmetric(@encAES, "aes", @null, @password, @null, @salt, @null, @initVector)
      ]%%
    
      import { PBKDF2, AES, enc, mode, pad, algo } from 'crypto-js';
    
      const str = '[email protected]';
      const password = 'xyQ8n55tKi$@@4dy';
      const initVector = '198e3f0733ec4791';
      const salt = 'c2dc41eeab1e513a';
    
      // Encrypting the string using AES
      const encAES = encryptAES(str, password, salt, initVector);
      console.info('ENC AES', encAES);
    
      // Decrypting the encrypted string using AES
      const decAES = decryptAES(encAES, password, salt, initVector);
      console.info('DEC AES', decAES);
    
      function buildKey(password, salt) {
        return PBKDF2(password, enc.Hex.parse(salt), {
          keySize: 256 / 32,
          iterations: 1000,
          hasher: algo.SHA1,
        });
      }
    
      function encryptAES(data, password, salt, initVector) {
        return AES.encrypt(data, buildKey(password, salt), {
          iv: enc.Hex.parse(initVector),
          mode: mode.CBC,
          padding: pad.Pkcs7,
        }).toString();;
      }
    
      function decryptAES(data, password, salt, initVector) {
    
        return AES.decrypt(data, buildKey(password, salt), {
          iv: enc.Hex.parse(initVector),
          mode: mode.CBC,
          padding: pad.Pkcs7,
        }).toString(enc.Utf8);
      }
    

    他们说他们不能使用16字节的IV,而我们坚持使用32字节。我将来会检查这个。