【问题标题】:Google Spreadsheet: Encrypt cell content with Google Apps ScriptGoogle 电子表格:使用 Google Apps 脚本加密单元格内容
【发布时间】:2021-01-21 23:59:39
【问题描述】:

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

很遗憾,Google Apps 脚本中没有内置加密功能。

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

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

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

【问题讨论】:

  • 在 Google 电子表格中使用加密可能不是一个好主意,因为它会内置修订历史记录,允许任何用户在加密之前查看数据...您想如何解决这个问题?跨度>
  • @Serge insas 我会将加密值和原始值存储在同一个电子表格中。该脚本将仅使用 REST 协议将加密值上传到服务器。任何人都不会看到包含原始值的电子表格。
  • 好的,很高兴知道 ;-) 你将如何编写你的服务应用程序?气也?我的问题是你不能在应用程序而不是 SS 中加密它吗? (只是一个问题)
  • 理论上是的,但我希望将所有“逻辑”和加密放在一个地方,即电子表格。
  • 我不知道this example 是否可以满足您的需求。

标签: javascript google-apps-script google-sheets cryptojs sjcl


【解决方案1】:

好吧,我会这么说,因为这是我用于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 代码库“导入”到您的脚本项目中,除非您手动复制源代码逐个文件到您的脚本项目中。问题跟踪器上可能已经有功能请求,如果没有,您可以创建一个,我会给它加星标。


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

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

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

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

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

再次编辑:我不熟悉 iOS 开发或其内部结构,但 似乎在我看来 iOS can at least do some cryptographic operations。不过,您可能想进一步了解这些方法,因为我不确定您是如何将 GAS 和 iOS 放在一起的。很遗憾,我无法在这方面为您提供更多帮助。

【讨论】:

  • 感谢您的全面回答!是否有您推荐的简单轻量级代码的来源?我只需要“一些”加密,没什么太花哨的。
  • 我对我的原始答案做了重要的补充,请参阅底部的 edit 部分。我希望这会有所帮助 :) 哦,如果其中一种方法似乎符合您的需求,请确保将其作为答案 ;)
【解决方案2】:

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

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 时得到的结果

基于这篇帖子here

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 2016-09-25
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多