【发布时间】:2020-12-14 22:48:27
【问题描述】:
我正在尝试将 3 个不同的元素加密为 API 的 http 标头的身份验证令牌。此 API 已内置于 Google 表格中,我目前无法使用其他任何东西。
身份验证令牌需要 4 个部分:
- API 密钥
- UTC 格式的时间戳
- API 操作
- API 密钥
API KEY:TIMESTAMP:API ACTION:API Secret Key 格式
出于本示例的目的,假设
- API 密钥为 test123,
- UTC 日期:2011 年 4 月 14 日星期四 22:44:22 GMT
- API 操作是“分类帐”
- API 密钥是 UAV213Q
当我在 python 中使用以下格式“test123:Thu, 14 Apr 2011 22:44:22 GMT:ledger:UAV213Q”测试示例时,我得到了结果 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 (分类帐)并将其合并到加密中
【问题讨论】:
-
您能否提供您期望的示例输入和输出值?不幸的是,根据您的问题,我无法理解它们。对此我深表歉意。
-
@Tanaike 编辑以包含展示示例输入的格式。我期望这样的输出 78D54A3051AE0AAAF022AA2DA230B97D5219D82183FEFF71E2D53DEC6057D9F1
-
感谢您的回复。在您的情况下,您能否提供创建签名的规范?因为我无法理解从
API key is test123、API action is 'ledger'、API Secret key is UAV213Q和In the format of API KEY:TIMESTAMP:API ACTION:API Secret Key的值中检索78D54A3051AE0AAAF022AA2DA230B97D5219D82183FEFF71E2D53DEC6057D9F1输出的逻辑。而且,我认为为了检索您的预期结果,需要“TIMESTAMP”的样本值。也可以提供吗? -
@Tanaike 谢谢,我还是新手。我已经使用示例格式和使用 python 获得的预期输出编辑了问题。在没有使用示例输入之前忽略我给你的那个
-
感谢您的回复。您可以将python脚本添加到您的问题中吗?我想尝试了解从您的 python 脚本创建签名的规范。
标签: javascript google-apps-script encryption google-sheets sha256