在Google Apps脚本中使用Crypto-JS - 什么是C.lib?

时间:2013-11-21 08:18:32

标签: javascript c google-apps-script cryptojs

我希望我们在Google Apps脚本中Crypto-JS并将所有源文件复制到我的项目中。

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

var C_lib = C.lib;

这是我的“JavaScript for Dummies”问题(我是一个JavaScript新手): - )

如何在Google Apps脚本中引用和使用C.lib? 什么是C.lib?我没有在Google和SO上找到任何好的信息。

3 个答案:

答案 0 :(得分:2)

来自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>

没有任何其他链接。

答案 1 :(得分:2)

这里有一个在Apps脚本中运行的各种cryptoJS功能的例子。

http://ramblings.mcpher.com/Home/excelquirks/oauthtoo/cryptogs

虽然速度很慢但确实有效。

答案 2 :(得分:1)

  • 在app脚本中导入外部库的主要问题是完全缺乏对模块的支持。

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

对于cryptoJS,

  • 需要手动确定依赖项。通常使用requiredefine将其记录在脚本的前几行中。脚本中的以下链接显示了此类行。

  • 关于不受支持的类,app脚本不支持cryptonode中都存在的本机window库。在这种情况下,不能通过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)中所有受支持的方法