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结合在一起;不幸的是我无法在这个领域提供更多帮助。
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;
}
可以使用JavaScript内置的eval()函数来使用外部库(例如:eval(UrlFetchApp.fetch('path/to/library'))
)。
当然,为了使其正常工作,该库必须没有依赖项。