正确计算Google Apps Script中带十六进制密钥的HMAC

正确计算Google Apps Script中带十六进制密钥的HMAC

本文深入探讨了在Google Apps Script中使用十六进制密钥正确计算HMAC的常见问题。通过对比PHP和Google Apps Script的实现差异,重点阐述了将十六进制密钥和消息字符串精确转换为字节数组的重要性,并提供了详细的示例代码和注意事项,确保HMAC计算结果的一致性。

引言

hmac(keyed-hash message authentication code)是一种使用密钥的哈希消息认证码,广泛应用于api认证和数据完整性验证。在跨平台或跨语言实现hmac时,开发者常会遇到计算结果不一致的问题,尤其是在处理非标准格式的密钥(如十六进制字符串)时。本文将以一个具体的案例为例,详细讲解如何在google apps script中正确处理带十六进制密钥的hmac计算,使其与php等其他语言的实现保持一致。

问题描述

在API认证场景中,我们可能需要使用HMAC对请求进行签名。假设API提供了一个8字节的十六进制密钥,例如 C77C96EEF6F6995B。当使用PHP脚本按照厂商说明成功生成HMAC并完成认证后,尝试在Google Apps Script中以类似方式实现时,却得到了不同的哈希值,导致认证失败。

PHP工作示例:


上述PHP脚本生成的哈希值为 9b5f9bb41ac30b9c55b10f3cecdd6e12e852f274,该值经验证可用于API认证。

Google Apps Script尝试实现(失败):

function bytesToHex(data) {    return data.map(function(e) {        var v = (e < 0 ? e + 256 : e).toString(16);        return v.length == 1 ? "0" + v : v;    }).join("");}function callNumbers() {  // 尝试将十六进制转换为字符作为密钥  var klucz = String.fromCharCode(parseInt("C7",16))+String.fromCharCode(parseInt("7C",16))+String.fromCharCode(parseInt("96",16))+String.fromCharCode(parseInt("EE",16))+String.fromCharCode(parseInt("F6",16))+String.fromCharCode(parseInt("F6",16))+String.fromCharCode(parseInt("99",16))+String.fromCharCode(parseInt("5B",16));   var user = "user@example.com"; // 实际应用中请替换为真实邮箱  var url = "https://www.ifirma.pl/iapi/abonent/miesiacksiegowy.json";  var wiadomosc = url+user+"abonent";  // 直接传入字符串和字符密钥  var hmac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_1, wiadomosc, klucz);  hmac=bytesToHex(hmac)  Logger.log(hmac);}

这段Google Apps Script代码生成的哈希值为 6f50edae11b1f7f5b8488a99c4df3e797662c739,与PHP结果不符。

根源分析:字节数组的精确处理

导致HMAC计算不一致的根本原因在于Google Apps Script中的 Utilities.computeHmacSignature 函数对输入参数(消息和密钥)的期望类型和字节表示方式与PHP存在差异。

密钥的误解:PHP的 chr(hexdec(‘XX’)) 将十六进制值转换为单个原始字节字符,这些字符串连接起来形成一个字节序列作为HMAC密钥。Google Apps Script中的 String.fromCharCode(parseInt(hex, 16)) 会创建JavaScript字符串。虽然这些字符串看起来包含正确的字符,但当它们被 Utilities.computeHmacSignature 作为密钥处理时,可能不会被解释为期望的原始字节数组。Utilities.computeHmacSignature 函数的 key 参数期望的是 byte[] 类型,即一个Java风格的带符号8位整数数组。

消息的误解:Utilities.computeHmacSignature 的 value 参数同样期望 byte[] 类型。直接传入JavaScript字符串 wiadomosc 可能导致内部默认的字符串到字节数组转换与API期望的编码(通常是UTF-8)不完全一致,或者与PHP中字符串的字节表示方式不同。PHP中的字符串在哈希函数中通常直接按其字节内容处理。

解决方案:正确的字节数组转换

要解决这个问题,我们需要确保将十六进制密钥和消息字符串都精确地转换为Google Apps Script Utilities.computeHmacSignature 函数所期望的 byte[] 类型。

1. 十六进制密钥转换为带符号字节数组

Google Apps Script的 byte[] 存储的是带符号的8位整数(范围从-128到127)。而十六进制值通常表示无符号字节(范围从0到255)。因此,我们需要将无符号十六进制值转换为其对应的带符号字节表示。

例如,十六进制 C7 对应的无符号十进制是 199。作为带符号字节,199 实际上是 -57(因为 199 – 256 = -57)。对于十六进制 7C,对应的无符号十进制是 124,它在带符号字节范围内,因此保持 124。

以下代码片段展示了如何将十六进制字符串 C77C96EEF6F6995B 转换为符合 byte[] 要求的带符号字节数组:

var hexKeyString = "C77C96EEF6F6995B";var kluczByteArray = hexKeyString.match(/.{2}/g).map(e => {  let byteValue = parseInt(e, 16); // 将每对十六进制字符转换为无符号整数  // 如果无符号值大于127(即最高位为1),则转换为对应的带符号值  return (parseInt(e[0], 16).toString(2).length == 4) ? byteValue - 256 : byteValue;});// 简化的条件判断:如果解析的十六进制值大于127,则减去256// return (byteValue > 127) ? byteValue - 256 : byteValue;

解释上述 map 函数中的条件判断:parseInt(e[0], 16).toString(2).length == 4 这个条件检查的是十六进制对 e 的第一个字符 e[0] 对应的十进制值(例如,’C’ 对应 12)转换成二进制后是否为4位。这个条件对于所有十六进制数字 8 到 F 都是 true,而对于 0 到 7 则是 false。这意味着,当十六进制对的第一个字符是 8-F 时(即该字节的无符号值在 128-255 范围内),byteValue – 256 会被执行,将其转换为对应的负数带符号字节。如果第一个字符是 0-7(即该字节的无符号值在 0-127 范围内),则 byteValue 保持不变,因为其已在带符号字节范围内。这正是将无符号字节正确映射到带符号字节的方法。

2. 消息字符串转换为字节数组

对于消息字符串,我们需要使用 Utilities.newBlob(string).getBytes() 方法将其转换为UTF-8编码的字节数组。这确保了消息的字节表示与PHP中字符串的默认处理方式保持一致。

var wiadomoscString = url + user + "abonent";var wiadomoscByteArray = Utilities.newBlob(wiadomoscString).getBytes();

3. 整合到Google Apps Script

将上述转换应用到Google Apps Script代码中,修正后的 callNumbers 函数如下:

function bytesToHex(data) {    return data.map(function(e) {        var v = (e  {    let byteValue = parseInt(e, 16);    // 根据十六进制值范围转换为带符号字节    return (parseInt(e[0], 16).toString(2).length == 4) ? byteValue - 256 : byteValue;  });  var user = "user@example.com"; // 实际应用中请替换为真实邮箱  var url = "https://www.ifirma.pl/iapi/abonent/miesiacksiegowy.json";  var wiadomoscString = url + user + "abonent";  // 将消息字符串转换为UTF-8编码的字节数组  var wiadomoscByteArray = Utilities.newBlob(wiadomoscString).getBytes();  // 使用转换后的字节数组进行HMAC计算  var hmac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_1, wiadomoscByteArray, kluczByteArray);  hmac = bytesToHex(hmac);  Logger.log(hmac);}

以上就是正确计算Google Apps Script中带十六进制密钥的HMAC的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1272911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月10日 15:12:33
下一篇 2025年12月10日 15:12:44

相关推荐

  • Tether新增20亿美元储备资产 稳定币USDT与美元锚定稳定性增强

    tether近期在以太坊和tron等区块链上共铸造了20亿美元的usdt储备,为未来兑换需求和市场流动性做好准备。此举不仅进一步巩固了usdt与美元1:1挂钩的稳定锚定,也传递出市场需求可能快速增长的积极信号。 如果你还未注册安全稳定的平台,建议注册一个账户以便及时参与和关注USDT相关变化。币安B…

    2025年12月10日
    000
  • 比特币BTC今日价格行情 比特币24小时实时汇率K线历史走势图

    比特币(BTC),作为加密货币世界的开创者和无可争议的王者,早已不仅仅是一种数字资产,更是一种席卷全球的金融现象。它以其去中心化、总量恒定的特性,被誉为“数字黄金”,吸引了无数追求前沿技术和资产增值的投资者。 为了方便您快速进入数字货币的世界,本文将为您提供官方App的直接下载通道。您只需点击文中提…

    2025年12月10日
    000
  • 以太坊今日行情走势app 以太坊实时k线图表在线分析

    以太坊(Ethereum)是一个备受欢迎的开源区块链平台,它以其智能合约功能而闻名,其原生加密货币为以太币(ETH)。作为市值领先的数字货币之一,以太坊的价格波动和行情走势一直备受投资者关注。 当前以太坊实时价格:根据最新数据,eth价格约为$3,673.13(价格可能因市场波动而变化,具体以app…

    2025年12月10日
    000
  • PENDLE币项目解析 PENDLE币是否具备长期投资潜力

    pendle 是近年来受到关注的 defi 项目代币,主打的是收益拆分概念,在去中心化收益管理赛道中具备一定创新性。随着 defi 市场的发展,pendle 的应用范围和生态正在逐步扩展,但对于投资者而言,它是否具备长期价值,还需结合项目背景、代币机制及市场前景多维度评估。 在深入分析之前,新手建议…

    2025年12月10日
    000
  • 如何进入币安官方平台 币安交易所官网登录链接

    币安是全球领先的数字资产交易平台,支持现货、合约、理财等服务。为了保障账户与资金安全,新手用户应通过官方登录链接或 app 快速直达平台。 官网登录链接: 客户端下载地址: 1. 如何确认登录链接安全可靠 请确保访问地址以https://www.binance.com或币安官方备用域名开头,并确认浏…

    2025年12月10日
    000
  • 哪里可以买卖狗狗币?币安交易所DOGE币交易全攻略

    1、点击官方下载链接获取币安App安装包;2、下载完成后在文件管理器中找到安装文件并点击安装,根据提示允许未知来源应用以确保安装顺利进行;3、安装成功后打开应用,选择注册并填写邮箱或手机号,设置包含字母、数字和特殊符号的复杂密码以增强账户安全;4、完成注册后登录账户,并按照平台指引完成身份认证(KY…

    2025年12月10日
    000
  • 币安苹果App官方下载入口 iOS最新版本Binance交易所一键下载安装指南

    币安(binance)是全球领先的加密货币交易平台,ios 版app最新版支持最新系统优化和安全升级。新手用户通过苹果官方渠道安装,可以最大限度保障您的账户与资产安全。 官网链接: 客户端下载地址: 1. 打开官网并验证正版App来源 建议直接访问币安官网“下载中心”,点击 iOS 入口后会跳转至 …

    2025年12月10日
    000
  • bitget网页版怎么登录?bitget官网地址链接及App下载入口

    bybit是知名的数字资产交易平台之一,提供现货、合约、杠杆、理财等多项功能。为了保障账户与资金安全,建议通过官方渠道下载并注册账户。 官网链接:www.bybit.com 客户端下载地址: 1. 如何确认访问的是 Bybit 官方平台 建议通过Bybit官方社媒(如推特、微信公众号)或官网公告获取…

    2025年12月10日
    000
  • 火币交易所网页版注册入口最新

    注册火币交易所网页版账户需先访问官网并点击“注册”按钮,1. 选择邮箱、手机号或Google账户注册方式;2. 输入对应信息;3. 创建并确认密码;4. 同意服务条款和隐私政策;5. 点击“注册”完成账户创建;之后需验证邮箱或手机号,设置两步验证等安全措施,并可选完成KYC身份验证,全部完成后即可进…

    2025年12月10日
    000
  • 火币交易所官网入口 火币唯一官方网址

    火币交易所(huobi global)于2023年完成品牌升级,正式更名为htx交易所。此次变更是其战略调整的一部分,但核心服务仍延续火币原有的交易体系。用户需注意,所有官方链接均已更新为htx域名。 2. 官网入口确认方式 唯一官方网址: 警惕仿冒网站,务必手动输入网址或通过官方社交媒体验证的链接…

    2025年12月10日
    000
  • 币安交易所app苹果手机版下载

    币安(binance)是全球领先的加密货币交易平台,为用户提供安全、便捷的数字资产交易服务。以下是关于币安官网入口的详细介绍: 官方网站地址 币安的官方网站地址为: 移动端入口 币安提供官方移动应用,可通过官网下载: iOS版本: Android版本: 新用户注册 官网首页右上角有”注册…

    2025年12月10日
    000
  • 火币(HTX)官网正确地址

    火币(htx)是全球领先的加密货币交易平台,为用户提供安全、便捷的数字资产交易服务。以下是关于火币官网入口的详细介绍: 官方网站地址 火币的官方网站地址为: 访问注意事项 验证网站真实性:访问前务必确认网址拼写正确,警惕钓鱼网站。官方网址应为”binance.com”而非类似…

    2025年12月10日
    000
  • SOL币价格实时更新app 索拉纳最新行情走势k线图免费查看

    索拉纳(Solana),简称SOL,是一个以其高吞吐量和低交易成本而闻名的高性能公链项目,常被视为以太坊的有力竞争者。它独特的历史证明(Proof of History)共识机制使其能够快速处理大量交易,吸引了众多开发者和用户的关注。 当前sol币实时价格:根据最新数据,sol价格约为$197.42…

    2025年12月10日
    000
  • SOL币实时行情价格app 索拉纳最新k线走势图在线分析

    索拉纳(Solana)是一个备受关注的高性能公有链项目,以其高吞吐量、低交易成本和可扩展性而闻名。其原生加密货币SOL币,在整个生态系统中扮演着支付交易费用和参与网络质押等关键角色。随着其生态的不断发展,实时掌握SOL的价格动态对于投资者和关注者而言至关重要。 当前sol币实时价格:根据最新数据,s…

    2025年12月10日
    000
  • 币安binance最新版本官网入口链接 币安交易所APP安装最新版

    币安(Binance)是全球知名的区块链数字资产交易平台,为用户提供安全、稳定、便捷的加密货币交易服务。它支持多种主流及创新的数字货币,并以其强大的技术支持和严格的资产安全管理而受到全球用户的信赖。 本文将为您提供币安最新版本的官方app下载链接和详细的安装教程,您只需点击文中提供的下载链接,即可轻…

    2025年12月10日
    000
  • 币安交易所官方最新版本APP入口 binance最新版官网下载地址

    币安(Binance)是全球知名的数字资产交易平台,为用户提供广泛的加密货币交易服务、安全的资产管理以及丰富的金融产品。其App设计简洁,操作流畅,是众多数字货币爱好者的首选交易工具。 本文将为您提供币安官方最新版app的下载与安装教程,点击本文中提供的下载入口即可直接获取官方安装包,确保您的下载渠…

    2025年12月10日
    000
  • 2025年最关键的稳定币政策框架细节——GENIUS Act

    2025年7月18日,美国总统正式签署生效了备受关注的稳定币联邦法律——genius act(guiding and establishing national innovation for u.s. stablecoins act),这是美国首次制定的专门针对稳定币的全面监管框架,标志着美国稳定币…

    2025年12月10日
    000
  • ETH价格动态实时更新app 以太坊行情走势图在线浏览

    以太坊(eth),作为加密世界的璀璨明星,远不止是一种简单的数字货币。它是一个革命性的全球去中心化计算平台,通过其核心的智能合约技术,为去中心化金融(defi)、非同质化代币(nft)以及无数创新应用(dapps)奠定了基石。关注以太坊的价格动态,不仅仅是投资者的日常,更是洞察整个区块链技术发展趋势…

    2025年12月10日
    000
  • SOL币最新价格走势图实时查询app SOL币24小时行情k线在线分析

    SOL币,即Solana平台的原生代币,是基于一个以高速度和低交易成本著称的高性能公链。Solana旨在为去中心化应用(DApps)和加密货币提供一个可扩展、安全且高效的基础设施。 当前sol币实时价格:根据最新数据,sol价格约为$197.42(价格可能因市场波动而变化,具体以app内显示为准),…

    2025年12月10日
    000
  • DOGE币最新交易渠道推荐?币安平台狗狗币买卖教程

    币安(Binance)是全球领先的数字资产交易平台之一,为用户提供广泛的加密货币交易服务,其中就包括备受关注的狗狗币(DOGE)。它以其丰富的交易对、高流动性和可靠的安全系统而受到全球用户的信赖。本文将为您详细介绍如何下载并安装其官方应用程序,并提供了官方app下载链接,点击本文提供的下载链接即可安…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信