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 編碼的函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM