js实现mac
实现 MAC(消息认证码)的 JavaScript 方法
使用 Web Crypto API 实现 HMAC
Web Crypto API 是浏览器原生支持的加密接口,可用于生成 HMAC(基于哈希的消息认证码)。以下示例展示如何使用 SHA-256 算法生成 HMAC:
async function generateHMAC(message, secretKey) {
const encoder = new TextEncoder();
const key = await crypto.subtle.importKey(
'raw',
encoder.encode(secretKey),
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
);
const signature = await crypto.subtle.sign(
'HMAC',
key,
encoder.encode(message)
);
return Array.from(new Uint8Array(signature))
.map(b => b.toString(16).padStart(2, '0'))
.join('');
}
// 使用示例
generateHMAC('hello world', 'my-secret-key')
.then(hmac => console.log('HMAC:', hmac));
使用 Node.js 的 crypto 模块
在 Node.js 环境中,可使用内置的 crypto 模块实现 HMAC:
const crypto = require('crypto');
function generateHMAC(message, secretKey) {
return crypto
.createHmac('sha256', secretKey)
.update(message)
.digest('hex');
}
// 使用示例
const hmac = generateHMAC('hello world', 'my-secret-key');
console.log('HMAC:', hmac);
使用第三方库实现 CMAC
对于更复杂的 MAC 算法如 CMAC(基于块密码的消息认证码),可使用 node-forge 等第三方库:

const forge = require('node-forge');
function generateCMAC(message, key) {
const cipher = forge.cipher.createCipher('AES-CMAC', key);
cipher.start();
cipher.update(forge.util.createBuffer(message));
cipher.finish();
return cipher.output.toHex();
}
// 使用示例
const cmac = generateCMAC('hello world', forge.random.getBytesSync(16));
console.log('CMAC:', cmac);
注意事项
- HMAC 密钥应具有足够长度(建议至少 16 字节)
- 避免硬编码密钥,应从安全配置中读取
- 在浏览器环境中使用时,需确保页面通过 HTTPS 加载
- 对于高安全需求场景,推荐使用专业的加密库如
libsodium.js
性能优化建议
- 对于高频调用的场景,可缓存 CryptoKey 对象避免重复导入
- 大数据可分块处理,避免内存压力
- Web Worker 中执行耗时加密操作,避免阻塞主线程






