zoukankan      html  css  js  c++  java
  • 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
     格式拼接;2)多个头部,按照头部 key(小写)的字典排序进行拼接。此例中为:content-type:application/x-www-form-urlencoded
    host:cvm.tencentcloudapi.com
    
      let CanonicalHeaders = 'content-type:application/x-www-form-urlencoded
    host:cvm.tencentcloudapi.com
    ';
      // 参与签名的头部信息,说明此次请求有哪些头部参与了签名,和 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 + '
    ' +
        CanonicalURI + '
    ' +
        CanonicalQueryString + '
    ' +
        CanonicalHeaders + '
    ' +
        SignedHeaders + '
    ' +
        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 + '
    ' +
        RequestTimestamp + '
    ' +
        CredentialScope + '
    ' +
        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 编码的函数
  • 相关阅读:
    Oracle问题之ORA-12560TNS:协议适配器错误
    调用脚本的方式自动的创建或者是更新oracle数据库自带的Seq序列号的值
    linux在telnet情况下root登录提示login incorrect
    CentOS 7 中 Systemd详解
    CentOS7 下安装telnet服务
    linux 安装telnet命令及使用
    Linux安装telnet
    Linux系统xinetd服务启动不了
    linux服务安装与配置(二):安装xinetd服务
    Linux超级守护进程——xinetd
  • 原文地址:https://www.cnblogs.com/ChineseLiao/p/10181686.html
Copyright © 2011-2022 走看看