Node.js中使用HMAC进行hash加密

HMAC 是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写。它的过程是把消息M和密钥s作为输入,使用 hash 算法生成一个定长的消息摘要。

HMAC 目前在 IPSec 和其他网络协议(如 SSL )中得以广泛应用。在 nodejs 中已经提供了 crypto 模块,不需要额外安装 npm 包。

我们以钉钉自定义机器人文档中要求的 HmacSHA256 为例说明如何使用,文档中关于加签的说明如下:

第一步,把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。

const crypto = require('crypto');

const hmac = crypto.createHmac('sha256', 'your-secret-key')
            
hmac.update(Date.now() + '\n' + 'your-secret-key');

console.log(hmac.digest('base64')); // kXogg18q...

// 钉钉加签最后需要urlencode
// console.log(encodeURIComponent(hmac.digest('base64'))) 
// ceux%2BxGQccRY...

需要注意的是钉钉文档中注明,对最后的 base64 需要进行 urlencode ,所以我们使用 encodeURIComponent 对结果进行处理。

crypto.createHmac(algorithm, key[, options])

  • algorithm <string>
  • key <string> | <Buffer> | <TypedArray> | <DataView> | <KeyObject>
  • options <object> stream.transform

创建并返回一个 Hmac 对象。

algorithm 是指定算法, key 是用于生成 HMAC 哈希的密钥, options 用来控制流的行为。

hmac.update(data[, inputEncoding])

data <string> | <Buffer> | <TypedArray> | <DataView>
inputEncoding <string>

data 为设置加签内容, inputEncoding 表示字符编码,默认是 utf8

hmac.digest([encoding])

encoding <string>
<Buffer> | <string>

计算 hmac.update 传入所有数据的 HMAC 摘要,如果指定 encoding ,就会返回字符串,否则会返回 Buffer

如何生成某个文件的 sha256 HMAC

const filename = process.argv[2];
const crypto = require('crypto');
const fs = require('fs');

const hmac = crypto.createHmac('sha256', '密钥');

const input = fs.createReadStream(filename);
input.on('readable', () => {
  // 哈希流只会生成一个元素。
  const data = input.read();
  if (data)
    hmac.update(data);
  else {
    console.log(`${hmac.digest('hex')} ${filename}`);
  }
});
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章