HAMC的JavaScript实现案例

举报
码乐 发表于 2024/12/07 13:17:52 2024/12/07
【摘要】 1 简介详细分析HMAC通过密码和订单数据生成签名的步骤,并且实现一个例子展示HMAC如何计算和校验。HMAC(Hash-based Message Authentication Code)概述HMAC 是基于哈希算法的一种消息认证码,它通过一个密钥和一个消息(数据)来生成一个签名(哈希值)。该签名是消息内容的“指纹”,可以确保消息的完整性和身份验证。只有知道密钥的双方才能计算和验证签名。...

1 简介

该文分析HMAC通过密码和订单数据生成签名的步骤,并且实现一个例子展示HMAC如何计算和校验。

HMAC(Hash-based Message Authentication Code)概述,HMAC 是基于哈希算法的一种消息认证码,它通过一个密钥和一个消息(数据)来生成一个签名(哈希值)。

该签名是消息内容的“指纹”,可以确保消息的完整性和身份验证。只有知道密钥的双方才能计算和验证签名。

2 步骤

  1. 生成HMAC签名(generateHMACSignature 函数)

输入:消息 (message) 和密钥 (secret)。
创建 HMAC 对象:使用 Go 内置的 hmac.New 函数与指定的哈希算法(这里使用 SHA-256)以及密钥来创建一个 HMAC 对象。
写入消息:使用 mac.Write 方法将消息写入 HMAC 对象。
计算 HMAC 签名:使用 mac.Sum(nil) 计算最终的 HMAC 签名并返回。
返回 Base64 编码:HMAC 签名是一个二进制数据,我们将其编码为 Base64 格式,以便于传输或存储。

  1. 验证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 签名。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。