在谷歌应用程序脚本中使用CryptoJS-什么是C.lib

Using Crypto-JS in Google Apps Script - What is C.lib?

本文关键字:什么 CryptoJS- lib 谷歌 应用程序 脚本      更新时间:2023-09-26

我想在谷歌应用程序脚本中使用Crypto-JS,并已将所有源文件复制到我的项目中。

当尝试使用AES加密数据时,我无法使其工作,因为aes.js中的以下引用在Google Apps脚本中无效:

var C_lib = C.lib;

这是我的"傻瓜的JavaScript"问题(我是JavaScript新手):-)

如何将C.lib与Google Apps Script一起引用和使用?什么是C.lib?我在谷歌和SO上没有找到任何好的信息。

来自core.js:

/**
 * Library namespace.
 */
var C_lib = C.lib = {};

看起来CryptoJS包中的每个文件都使用它,比如:

var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var BlockCipher = C_lib.BlockCipher;

所以,如果您使用的是开发版本,那么很可能您必须链接core.js

CryptoJS 3.1 示例

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
    var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
    var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
</script>

在没有任何其他链接的情况下工作。

  • 在应用程序脚本中导入外部库的主要问题是完全缺乏对模块的任何支持。

  • 另一个问题是不受支持的类/方法。

在cryptoJS的情况下,

  • 依赖关系需要手动计算。它通常使用requiredefine记录在脚本的前几行中。脚本中的以下链接显示了这样的行。

  • 关于不支持的类,应用程序脚本不支持nodewindow中都存在的本机crypto库。在这种情况下,AFAIK无法回避这个问题。因此,不可能使用CryptoJS的最新版本。但可以使用旧版本。

示例脚本:

function getCryptoJS() {
  const baseUrl = (file, version = '3.3.0') =>
    `https://unpkg.com/crypto-js@${version}/${file}.js`;
  const require = ((store) => (file) => {
    if (Array.isArray(file)) return file.forEach(require);
    if (store[file]) return;
    store[file] = true;
    eval(UrlFetchApp.fetch(baseUrl(file.slice(2))).getContentText());
  })({});
  /**
   * AES
   * @see https://github.com/brix/crypto-js/blob/31d00127a7c87066c51abe56e7b8be3a32141cae/aes.js#L8 for dependencies
   */
  const dependenciesAES = [
    './core',
    './enc-base64',
    './md5',
    './evpkdf',
    './cipher-core',
    './aes',
  ];
  require(dependenciesAES);
  const ciphertext = CryptoJS.AES.encrypt(
    'my message',
    'secret key 123'
  ).toString();
  /**
   * SHA3
   * @see https://github.com/brix/crypto-js/blob/31d00127a7c87066c51abe56e7b8be3a32141cae/sha3.js#L4 for  dependencies list
   */
  const dependenciesSHA3 = ['./core', './x64-core', './sha3'];
  dependenciesSHA3.forEach(require);
  const hash = CryptoJS.SHA3('Message');
  console.log({ ciphertext, hash: hash.toString() });
}

以类似的方式,您可以使用CryptoJS 3.3.0(=3.1.9-1)中所有支持的方法