7

我有一个谷歌电子表格,想加密几个单元格的内容(我不在乎使用哪种加密方法,只要有适用于 iOS 的等效解密方法)。

不幸的是,Google Apps Script 中没有内置加密功能。

出于这个原因,我想使用像Crypto-JSsjcl这样的开源 Javascript 库。

如何将这些库之一与 Google Apps 脚本一起使用?

在 Google Apps 脚本文档中,我没有找到任何关于如何将外部 JavaScript 库与我的 Google Apps 脚本一起使用的线索。

4

2 回答 2

10

好吧,我会这么说,因为这是我在Date JS中使用的方法。您可以执行以下操作:

  1. 下载源 .js 文件。
  2. 在文本编辑器中打开 .js 文件
  3. 将所有代码复制/粘贴到新的脚本项目中
    • 在这里,您可以“重新创建”具有相同名称的原始 .js 文件(单独复制/粘贴源)
  4. 将该脚本项目的项目密钥包含为您要在其中使用这些功能的项目的库。

即使这些项目是开源的,如果要使用它们,您也需要确保遵守这些项目的许可。

这基本上是一个小“黑客”,无法将 .js 文件上传到 GAS 项目中。假设 JS 是标准的,这种方法将适用于谷歌的系统。


另一种选择是简单地找到一个轻量级的单功能或双功能加密包,或者像 AES-128 这样的单一加密算法(当然,您有权使用)。这实际上取决于您想要多少加密,是否需要反转密文以获取纯值等。

如果这是某种密码系统,我建议使用简单的哈希。例如:

function stringHash (someString) {
    var hash = 0;
    if (this.length == 0) return hash;
    for (i = 0; i < this.length; i++) {
        char = this.charCodeAt(i);
        hash = ((hash << 5) - hash) + char;
        hash = hash & hash;
    }
    return Math.abs(hash); // Personally I don't like negative values, so I abs'd it
}

您将在其中询问用户的密码,并且如果密码哈希与存储在电子表格或其他任何地方的哈希匹配,那么您将进行验证。您可以使用它来模拟登录到 UiApp GUI,例如:将用户名/密码哈希存储在数据库中并在加载“真实”应用程序之前验证用户。


然而,正如 Serge 提到的,电子表格将包含原始值在散列之前的修订历史,以及散列之后的值。如果您想避免这种情况,请使用 ScriptDB。


PS - 除了这个解决方法之外,我会说目前不可能将非 GAS 代码库“导入”到您的脚本项目中,除非您手动将源文件逐个文件复制到您的脚本项目中。问题跟踪器上可能已经有功能请求,如果没有,您可以创建一个,我会给它加星标。


编辑:根据要求,我在答案中包含了一个开源 AES加密“包”(也包含 base64,这很好),作为其他想要在 GAS 中加密的人的参考。确保您遵循作者的要求,即保留他的原始版权并链接回源。

除了我链接的 AES 和简单的哈希(相当于 Java 的 String.hashCode()),其资源可以在这里找到,还有 Crypto-JS 正如你在你的问题中提到的那样,如果你花时间完全复制/粘贴所有代码(假设与许可条款一致 - 我尚未阅读),您可以按照我在答案上半部分中描述的步骤使用它。

Javascript中的 MD5 也是您可以使用的算法。如果您使用位于页面顶部的md5.js中的代码,您将拥有所需的内容。同样,如果您使用它,请确保您遵循许可规则。

就我个人而言,我可能只会使用哈希base-64模式,因为您使用这种加密的大部分内容可能并不是非常重要。AES 可能需要更长的时间来计算 - 您可能可以自己对其进行基准测试,看看它是否会导致触发器长时间运行时出现重大问题,但我怀疑这无论如何都会是一个问题。

注意:base-64 是 2-way,AES 也是。MD5是一种hash,我提供的简单hash函数也是(当然)hash。哈希函数是单向的。因此,如果您需要双向功能(加密/解密),请使用 base-64 或 AES。Base-64 本质上是 AES 的儿童版本。而简单的哈希函数就是MD5的儿童版。请记住这一点:)

再次编辑:我不熟悉 iOS 开发或其内部结构,但在我看来, iOS 至少可以进行一些加密操作。不过,您可能想进一步了解这些方法,因为我不确定您是如何将 GAS 和 iOS 放在一起的。不幸的是,我无法在这方面为您提供更多帮助。

于 2013-11-19T00:25:12.903 回答
1

上面的功能对我不起作用。这是您可以复制并粘贴到谷歌表格(电子表格)脚本编辑器中的内容

function enc(str) {
    var encoded = "";
    for (i=0; i<str.length;i++) {
        var a = str.charCodeAt(i);
        var b = a ^ 123;    // bitwise XOR with any number, e.g. 123
        encoded = encoded+String.fromCharCode(b);
    }
    return encoded;
}

这就是您在电子表格中使用它时得到的 =ENC

在此处输入图像描述

基于这里的这篇文章

于 2017-08-23T12:50:07.323 回答