谷歌电子表格:使用谷歌应用脚本加密单元格内容

7
我有一个谷歌电子表格,想要加密一些单元格的内容(我不关心所使用的加密方法,只要有iOS的等效解密方法即可)。
很遗憾,在Google Apps Script中没有内置的加密功能。
因此,我想使用一个开源的JavaScript库,例如Crypto-JSsjcl
如何在Google Apps Script中使用其中之一?
在Google Apps Script文档中,我没有找到任何关于如何在我的Google Apps Script中使用外部JavaScript库的线索。

2
在Google电子表格中使用加密可能不是一个好主意,因为内置的修订历史记录将允许任何用户在加密之前查看值...您如何想象解决这个问题? - Serge insas
好的,知道了;-)你会怎样编写你的服务应用程序?也是使用GAS吗?我的问题是,你不能在应用程序中加密它而不是在SS中加密吗?(只是个问题) - Serge insas
理论上是可以的,但我希望所有的“逻辑”和加密都在一个地方,即电子表格中。 - AlexR
好吧,我猜至少这些评论会让其他用户更清楚你的问题,就我个人而言,我在这个领域没有任何经验,所以无法帮忙...抱歉并祝好运。 - Serge insas
1
我不知道这个例子是否适合您的需求。 - Jacobvdb
显示剩余3条评论
3个回答

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是双向的,AES也是。MD5是一种哈希类型,而我提供的简单哈希函数也是(当然)一种哈希。哈希函数是单向的。因此,如果你需要双向功能(加密/解密),请使用base-64或AES。Base-64本质上是AES的儿童版本。而简单哈希函数是MD5的儿童版本。请记住这一点 :)

再次编辑:我不熟悉iOS开发或其内部机制,但是似乎iOS至少可以执行一些加密操作。您可能需要更深入地了解这些方法,因为我不太确定您如何将GAS和iOS结合在一起;不幸的是我无法在这个领域提供更多帮助。


谢谢您的全面回答!您能推荐一个简单轻量级代码的来源吗?我只需要“一些”加密,不需要太复杂的。 - AlexR
我对原来的回答做了重要的补充,请查看底部的 编辑 部分。希望这能有所帮助 :) 哦,如果其中一种方法似乎符合您的需求,请确保将其选为答案 ;) - Chris Cirefice

1
这些功能对我没用。您可以将以下内容复制并粘贴到Google Sheets(电子表格)脚本编辑器中。
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时,将得到以下结果。

enter image description here

基于这篇文章这里

0

可以使用JavaScript内置的eval()函数来使用外部库(例如:eval(UrlFetchApp.fetch('path/to/library')))。

当然,为了使其正常工作,该库必须没有依赖项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接