本篇文章介绍下通过HMAC-SHA1加密验证,将加密之后得到的签名作为参数发送请求,假如咱们需要按照下列要求将参数加密之后传递:
咱们来逐步分析得到签名的步骤和最终发送请求需要携带的参数内容,本次实现是在node.js的环境下。
首先引入node中需要借助的模块
引入我们需要使用node中的加密模块和字符串解析模块,代码如下
const crypto = require('crypto'); // Node.js 的加密模块
const querystring = require('querystring'); // Node.js 的查询字符串解析和格式化模块
将需要传递的参数拼成键值对形式的字符串
将所有参数作为属性放到一个对象params中,通过querystring模块的stringfy方法将该对象转化为第一个要求的querystring键值对拼接模式,并储存到queryString中,代码如下:
const params = {
"apikey": "私钥",
"test": "个人需要的参数"
};
const queryString = querystring.stringify(params);
使用HMAC-SHA1依据个人私钥进行加密
借助crypto模块的createHmac函数,createHmac函数的两个参数分别为sha1和个人私钥,update函数的参数是需要进行HMAC加密的字符串,digest函数表示加密操作完毕,返回最终的加密结果,代码如下:
const hmac = crypto.createHmac('sha1', '私钥'); // 请替换为您的私钥
hmac.update(queryString);
const encryptedResult = hmac.digest();
编码后生成URLEnode生成签名
通过toString函数进行Base64编码,借助encodeURIComponent函数生成URLEncode,代码如下:
const base64Encoded = encryptedResult.toString('base64');
const urlEncodedSign = encodeURIComponent(base64Encoded);
拼接签名作为最终请求参数
根据需要将sign拼接到参数后,得到最终的请求参数。代码如下:
const finalString = `${queryString}&sign=${urlEncodedSign}`;
备注
encodeURIComponent函数
它会对特殊字符进行编码,包括保留的字符(如!"#$%&'()*+,-./:;<=>?@[]^`{|}~)以及非ASCII字符。更适用于对URL的组成部分(如查询参数)进行编码。
encodeURI函数
它只会对那些不安全的字符进行编码,例如空格等。对于一些保留字符,如"/"和"@",并不会进行编码。更适用于对整个URI进行编码。