js 签名算法实现
签名算法实现(JavaScript)
HMAC-SHA256 签名示例
const crypto = require('crypto');
function generateHMAC(secret, message) {
return crypto
.createHmac('sha256', secret)
.update(message)
.digest('hex');
}
const signature = generateHMAC('your-secret-key', 'data-to-sign');
RSA 签名示例
const crypto = require('crypto');
const fs = require('fs');
const privateKey = fs.readFileSync('private.pem');
function signWithRSA(data) {
const sign = crypto.createSign('SHA256');
sign.update(data);
return sign.sign(privateKey, 'base64');
}
const signature = signWithRSA('important-data');
ECDSA 签名示例
const crypto = require('crypto');
const { privateKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'secp256k1'
});
function signWithECDSA(data) {
const sign = crypto.createSign('SHA256');
sign.update(data);
return sign.sign(privateKey, 'base64');
}
签名验证实现
// HMAC 验证
function verifyHMAC(secret, message, signature) {
const expectedSig = generateHMAC(secret, message);
return crypto.timingSafeEqual(
Buffer.from(expectedSig),
Buffer.from(signature)
);
}
// RSA 验证
const publicKey = fs.readFileSync('public.pem');
function verifyRSA(data, signature) {
const verify = crypto.createVerify('SHA256');
verify.update(data);
return verify.verify(publicKey, signature, 'base64');
}
浏览器环境实现
// Web Crypto API 示例
async function signWithWebCrypto() {
const key = await window.crypto.subtle.generateKey(
{ name: 'HMAC', hash: 'SHA-256' },
true,
['sign', 'verify']
);
const data = new TextEncoder().encode('message');
const signature = await window.crypto.subtle.sign('HMAC', key, data);
return Array.from(new Uint8Array(signature)).map(b => b.toString(16).padStart(2, '0')).join('');
}
注意事项
- 密钥管理应使用安全存储方案
- 生产环境建议使用专业的密钥管理服务
- 不同算法适用于不同安全需求场景
- 时间戳和随机数可防止重放攻击
- 签名结果通常需要Base64或Hex编码
性能优化建议
对于高频签名场景:

- 可缓存密钥对象避免重复解析
- 考虑使用更高效的算法如Ed25519
- 批量处理签名请求
以上实现可根据具体安全需求进行调整,建议结合实际的业务场景和安全规范进行实现。






