HMAC-SHA256 签名方法各个语音的实现方式之前端JavaScriptes6

sha256和16进制输出,网上很多种后端的验证方法,几乎没有前端的,所以自己写了个,希望给类似需求的人一个帮助,适用场景

腾讯云接口鉴权 v3签名


npm install sha256
npm install crypto-js
  import HmacSHA256 from 'crypto-js/hmac-sha256'
 import Hex from 'crypto-js/enc-Hex';
export function JsonSort256(jsonDataPost=null) { 
  // 第一步
  // HTTP 请求方法(GET、POST )本示例中为 GET;
  let HTTPRequestMethod = 'GET';
  // URI 参数,API 3.0 固定为正斜杠(/) 
  let CanonicalURI = '/';
  // CanonicalQueryString:发起 HTTP 请求 URL 中的查询字符串,对于 POST 请求,固定为空字符串,对于 GET 请求,则为 URL 中问号(?)后面的字符串内容,本示例取值为:Limit=10&Offset=0。注意:CanonicalQueryString 需要经过 URL 编码。
  let CanonicalQueryString = 'Limit=10&Offset=0';
  // 参与签名的头部信息,至少包含 host 和 content-type 两个头部,也可加入自定义的头部参与签名以提高自身请求的唯一性和安全性。拼接规则:1)头部 key 和 value 统一转成小写,并去掉首尾空格,按照 key:value\n 格式拼接;2)多个头部,按照头部 key(小写)的字典排序进行拼接。此例中为:content-type:application/x-www-form-urlencoded\nhost:cvm.tencentcloudapi.com\n
  let CanonicalHeaders = 'content-type:application/x-www-form-urlencoded\nhost:cvm.tencentcloudapi.com\n';
  // 参与签名的头部信息,说明此次请求有哪些头部参与了签名,和 CanonicalHeaders 包含的头部内容是一一对应的。content-type 和 host 为必选头部。拼接规则:1)头部 key 统一转成小写;2)多个头部 key(小写)按照字典排序进行拼接,并且以分号(;)分隔。此例中为:content-type;host
  let SignedHeaders = 'content-type;host';
  // 请求正文的哈希值,计算方法为 Lowercase(HexEncode(Hash.SHA256(RequestPayload))),对 HTTP 请求整个正文 payload 做 SHA256 哈希,然后十六进制编码,最后编码串转换成小写字母。注意:对于 GET 请求,RequestPayload 固定为空字符串,对于 POST 请求,RequestPayload 即为 HTTP 请求正文 payload。
  let HashedRequestPayload = sha256(encodeURI('')).toLowerCase();
  // 拼接规范请求串
  let CanonicalRequest =
    HTTPRequestMethod + '\n' +
    CanonicalURI + '\n' +
    CanonicalQueryString + '\n' +
    CanonicalHeaders + '\n' +
    SignedHeaders + '\n' +
    HashedRequestPayload;
    console.log('完成第一步',CanonicalRequest);

  // 第二步
  // 签名算法,目前固定为 TC3-HMAC-SHA256;
  let Algorithm = 'TC3-HMAC-SHA256';
  // 请求时间戳,即请求头部的 X-TC-Timestamp 取值,如上示例请求为 1539084154;
  let RequestTimestamp = '1539084154';
  // 凭证范围,格式为 Date/service/tc3_request,包含日期、所请求的服务和终止字符串(tc3_request)。Date 为 UTC 标准时间的日期,取值需要和公共参数 X-TC-Timestamp 换算的 UTC 标准时间日期一致;service 为产品名,必须与调用的产品域名一致,例如 cvm。如上示例请求,取值为 2018-10-09/cvm/tc3_request;
  let CredentialScope = '2018-10-09/cvm/tc3_request';
  // 前述步骤拼接所得规范请求串的哈希值,计算方法为 Lowercase(HexEncode(Hash.SHA256(CanonicalRequest)))。
  let HashedCanonicalRequest = sha256(CanonicalRequest).toLowerCase();
  let StringToSign =
    Algorithm + '\n' +
    RequestTimestamp + '\n' +
    CredentialScope + '\n' +
    HashedCanonicalRequest;
    console.log('完成第二步',StringToSign);

  // 第三步    
  // 原始的 SecretKey;
  let SecretKey = "Gu5t9xGARNpq86cd98joQYCN3EXAMPLE";
  // Date:即 Credential 中的 Date 字段信息,如上示例,为2018-10-09;
  let SecretDate = HmacSHA256('2018-10-09',"TC3" + SecretKey);
  // Service:即 Credential 中的 Service 字段信息,如上示例,为 cvm;
  let SecretService = HmacSHA256('cvm',SecretDate);
  // SecretSigning:即以上计算得到的派生签名密钥;
  let SecretSigning = HmacSHA256("tc3_request",SecretService);
  // StringToSign:即步骤2计算得到的待签名字符串;
  let Signature = Hex.stringify(HmacSHA256(StringToSign,SecretSigning));
  console.log('完成第三步',Signature);

  // 第四步
  // 签名方法,固定为 TC3-HMAC-SHA256;
  // let Algorithm = 'TC3-HMAC-SHA256';
  // SecretId:密钥对中的 SecretId;
  let SecretId = 'AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE';
  // let Authorization =
  //   Algorithm + ' ' +
  //   'Credential=' + SecretId + '/' + CredentialScope + ', ' +
  //   'SignedHeaders=' + SignedHeaders + ', '
  //   'Signature=' + Signature;
  let Authorization =
    Algorithm + ' ' +
    'Credential=' + SecretId + '/' + CredentialScope + ', ' +
    'SignedHeaders=' + SignedHeaders + ', '+
    'Signature=' + Signature
    console.log('完成第四步',Authorization);
}
sha256编码
Hex表示以小写字母形式返回摘要的 base-16 编码的函数

 

转载于:https://www.cnblogs.com/ChineseLiao/p/10181686.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HMAC-SHA256签名是一种使用HMAC算法和SHA-256哈希算法对数据进行签名方法HMAC(Hash-based Message Authentication Code)是一种基于哈希函数和密钥的消息认证码算法,用于确保数据的完整性和认证性。SHA-256是一种常用的哈希算法,用于将任意长度的数据转换为固定长度的哈希值。 在JMeter中进行HMAC-SHA256签名逻辑的添加,可以通过在HTTP Request下方添加一个JSR223 PreProcessor来实现。然后,需要编写Python脚本来计算签名,并将签名结果存储到变量中。 以下是一个示例Python脚本,用于计算HMAC-SHA256签名并将结果存储到变量中: ``` import hmac import hashlib api_key = "your_api_key" secret_key = "your_secret_key" timestamp = str(int(time.time() * 1000)) nonce = str(random.randint(100000, 999999)) params = {"amount": 100, "currency": "USD", "merchant_id": 1234} message = f"{timestamp}\n{nonce}\nPOST\n/payments\n{api_key}\n" \ "&".join([f"{k}={v}" for k, v in params.items()]) signature = hmac.new(secret_key.encode("utf-8"), message.encode("utf-8"), hashlib.sha256).hexdigest() vars.put("timestamp", timestamp) vars.put("nonce", nonce) vars.put("signature", signature) ``` 在这个示例中,我们使用了API Key和Secret Key来计算签名。首先,我们获取当前时间戳和随机数作为参数,并根据接口要求的格式构建消息。然后,我们使用HMAC函数和SHA-256哈希算法对消息进行签名,得到签名结果。最后,我们将时间戳、随机数和签名存储到JMeter的变量中,以供后续使用。 请根据实际情况修改示例中的API Key、Secret Key和参数,并将脚本添加到JMeter的JSR223 PreProcessor中,以实现HMAC-SHA256签名逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [揭秘支付接口测试:如何使用JMeter和Python打造绝密HMAC-SHA256签名逻辑?(Base64,Md5,Sha,Rsa等)实战...](https://blog.csdn.net/weixin_48500307/article/details/130274880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值