HAMC的JavaScript实现案例
1 简介
该文分析HMAC通过密码和订单数据生成签名的步骤,并且实现一个例子展示HMAC如何计算和校验。
HMAC(Hash-based Message Authentication Code)概述,HMAC 是基于哈希算法的一种消息认证码,它通过一个密钥和一个消息(数据)来生成一个签名(哈希值)。
该签名是消息内容的“指纹”,可以确保消息的完整性和身份验证。只有知道密钥的双方才能计算和验证签名。
2 步骤
- 生成HMAC签名(generateHMACSignature 函数)
输入:消息 (message) 和密钥 (secret)。
创建 HMAC 对象:使用 Go 内置的 hmac.New 函数与指定的哈希算法(这里使用 SHA-256)以及密钥来创建一个 HMAC 对象。
写入消息:使用 mac.Write 方法将消息写入 HMAC 对象。
计算 HMAC 签名:使用 mac.Sum(nil) 计算最终的 HMAC 签名并返回。
返回 Base64 编码:HMAC 签名是一个二进制数据,我们将其编码为 Base64 格式,以便于传输或存储。
- 验证HMAC签名(verifyHMACSignature 函数)
输入:消息 (message)、签名 (signature) 和密钥 (secret)。
重新生成签名:使用相同的消息和密钥重新计算 HMAC 签名。
比较签名:将生成的签名与接收到的签名进行比较,若一致则验证通过,返回 true,否则返回 false。
3 实现
你可以使用 crypto 模块来实现 HMAC 签名。下面是实现 generateHMACSignature 函数的代码,使用 SHA-256 哈希算法和 secret 密钥:
-
JavaScript 实现
const crypto = require('crypto'); // 生成 HMAC 签名 function generateHMACSignature(message, secret) { return new Promise((resolve, reject) => { try { // 创建一个 HMAC 对象,使用 SHA-256 哈希算法和 secret 密钥 const hmac = crypto.createHmac('sha256', secret); // 写入消息内容 hmac.update(message); // 计算哈希并将其编码为 Base64 字符串 const signature = hmac.digest('base64'); resolve(signature); } catch (err) { reject(err); } }); }
-
示例使用
generateHMACSignature('OrderID=12345&Amount=199.99&CustomerID=67890', 'supersecretkey') .then(signature => { console.log('Generated HMAC Signature:', signature); }) .catch(err => { console.error('Error generating HMAC signature:', err); });
-
说明和解释
crypto.createHmac(‘sha256’, secret):使用 crypto 模块的 createHmac 函数创建一个 HMAC 对象,指定使用 SHA-256 哈希算法,并传入 secret 密钥。
hmac.update(message):将消息内容写入 HMAC 对象中。
hmac.digest(‘base64’):计算 HMAC 签名并将其以 Base64 格式返回,类似于 Go 语言中的 base64.StdEncoding.EncodeToString。
Promise:为了符合 JavaScript 异步编程风格,函数使用了 Promise 来处理错误和返回值。
- 示例输出
Generated HMAC Signature:
ZmVmOGFkZjMwM2M0ZDg5ZDg3Njk0NzhkMTMwZmRkZGQ5YzM2ZWQ1NzdmOTlmMGM0MzkzZmVkZjhmY2I5MDZjNmI2YmMwM2Y2NjkzYjBlMjk4MjMwZDZkZDZh
4 小结 注意事项
crypto.createHmac 支持多种哈希算法,除了 sha256,还可以选择 sha1、sha512 等。
HMAC 签名的输出格式可以是 hex、base64 或 buffer,这里选择了 base64 格式,与语言实现保持一致。
你可以在 Node.js 环境中使用这段代码来生成 HMAC 签名。
- 点赞
- 收藏
- 关注作者
评论(0)