如何解决使用应用脚本在Google表格中进行sha-256加密 修改点:示例脚本:结果:参考:回答其他问题1:回答其他问题2:参考文献:
我正在尝试将3个不同的元素加密为API的http标头的身份验证令牌。该API内置于Google表格中,目前我无法使用其他任何东西。
身份验证令牌需要4个部分:
- API密钥
- UTC格式的时间戳
- API操作
- API密钥
采用API KEY:TIMESTAMP:API ACTION:API秘密密钥的格式
就本示例而言,假设
- API密钥为test123,
- UTC日期:2011年4月14日,星期四22:44:22 GMT
- API操作为“分类帐”
- API密钥为UAV213Q
当我使用以下格式的“ test123:Thu,14 Apr 2011 22:44:22 GMT:ledger:UAV213Q ”在python中测试示例时,我得到了结果 15594d1f608134cbfa3075ecda4664519cd198738b8f5c3ffa2c95272b854199 >
这是我使用的python脚本
def sha256():
# tested on Python 3.8.5
from urllib import parse,request
import hashlib
import datetime
from time import strftime,gmtime
# credentials and request params
my_merchant_id = 'apikey'
api_token = 'test123'
api_secret_key = 'UAV213Q'
my_timestamp = strftime("%a,%d %b %Y %H:%M:%S +0000",gmtime())
api_version = 2.9
action_verb = 'ledger'
# set up request params
data = parse.urlencode({'merchantId': my_merchant_id,'token': api_token,'version': api_version,'action': action_verb})
# authentication
sig = api_token + ':' + my_timestamp + ':' + action_verb + ':' + api_secret_key
sig_hash = hashlib.sha256(sig.encode('utf-8')).hexdigest()
my_headers = {'x-ShareASale-Date': my_timestamp,'x-ShareASale-Authentication': sig_hash}
print(sig_hash)
我已经尝试使用以下其他StackOverFlow问题中的解决方案 How do I get Google Apps Script to do SHA-256 encryption?,sha3-256 of a cell text in Google Spreadsheet,所有建议。
但是,我不断收到错误消息“不允许该函数使用NOW(),RAND()或RANDBETWEEN()引用单元格。”
我曾尝试通过A1中具有NOW()且B1 = A1来间接引用NOW()的单元格,甚至尝试使用TEXT()将其转换为文本。
API密钥需要具有时间戳记才能起作用。我正在考虑在App脚本本身中进行计算,因为它是一个已知常数。例如,在加密脚本中,它将对api令牌进行硬编码,以utc格式调用时间戳,并以正确的格式对api秘密密钥进行硬编码,也许只是对函数进行添加操作,以便我可以进行更改,因此它将变为sha256 (分类帐),并将其合并到加密中
解决方法
这个答案怎么样?
修改点:
- 当我看到您的python脚本时,我确认您问题中显示的规范与python脚本的规范不同。
- 似乎
Thu,14 Apr 2011 22:44:22 GMT
是Thu,14 Apr 2011 22:44:22 +0000
- 似乎需要使用摘要的“ SHA_256”。
- 似乎
示例脚本:
将您的python脚本转换为Google Apps脚本后,它如下所示。请复制并将其粘贴到脚本编辑器中,然后在脚本编辑器中运行函数myFunction
。这样,您可以在日志中看到结果值。
function myFunction() {
const api_token = 'test123';
const api_secret_key = 'UAV213Q';
const my_timestamp = 'Thu,14 Apr 2011 22:44:22 +0000';
const action_verb = 'ledger';
const value = `${api_token}:${my_timestamp}:${action_verb}:${api_secret_key}`;
const bytes = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256,value);
const res = bytes.map(byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
console.log(res)
}
结果:
在以上Google Apps脚本和您的python脚本中使用test123:Thu,14 Apr 2011 22:44:22 +0000:ledger:UAV213Q
时,两个结果如下。
8c3a6873fe71c402dc1e3ca7bc828712e3dfb7a66ed09feeeca2152dd809df81
参考:
已添加:
回答其他问题1:
当您要检索日期字符串如Thu,14 Apr 2011 22:44:22 +0000
时,请使用以下脚本。
const my_timestamp = new Date().toUTCString().replace("GMT","+0000");
回答其他问题2:
如果要以大写形式检索值,请使用以下脚本。但是,当我测试您的python脚本时,结果值为小写。所以请注意这一点。
function myFunction() {
const api_token = 'test123';
const api_secret_key = 'UAV213Q';
const my_timestamp = 'Thu,value);
const res = bytes.map(byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('').toUpperCase();
console.log(res)
}
- 在这种情况下,获得
8C3A6873FE71C402DC1E3CA7BC828712E3DFB7A66ED09FEEECA2152DD809DF81
。
参考文献:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。