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