使用应用脚本在Google表格中进行sha-256加密 修改点:示例脚本:结果:参考:回答其他问题1:回答其他问题2:参考文献:

如何解决使用应用脚本在Google表格中进行sha-256加密 修改点:示例脚本:结果:参考:回答其他问题1:回答其他问题2:参考文献:

我正在尝试将3个不同的元素加密为API的http标头的身份验证令牌。该API内置于Google表格中,目前我无法使用其他任何东西。

身份验证令牌需要4个部分:

  1. API密钥
  2. UTC格式的时间戳
  3. API操作
  4. API密钥

采用API KEY:TIMESTAMP:API ACTION:API秘密密钥的格式

就本示例而言,假设

  1. API密钥为test123,
  2. UTC日期:2011年4月14日,星期四22:44:22 GMT
  3. API操作为“分类帐”
  4. 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 GMTThu,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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-