js实现签名
实现数字签名(RSA-SHA256)
使用crypto模块生成密钥对并签名:
const crypto = require('crypto');
// 生成密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
});
// 签名函数
function signData(data, privateKey) {
const sign = crypto.createSign('SHA256');
sign.update(data);
return sign.sign(privateKey, 'base64');
}
// 验证函数
function verifySignature(data, signature, publicKey) {
const verify = crypto.createVerify('SHA256');
verify.update(data);
return verify.verify(publicKey, signature, 'base64');
}
// 示例
const data = '待签名字符串';
const signature = signData(data, privateKey);
const isValid = verifySignature(data, signature, publicKey);
console.log('签名验证结果:', isValid);
实现HMAC签名(对称加密)
适合API请求签名验证:
const crypto = require('crypto');
function createHMAC(key, message) {
return crypto
.createHmac('sha256', key)
.update(message)
.digest('hex');
}
const secretKey = 'your-secret-key';
const message = '请求参数排序拼接';
const hmacSignature = createHMAC(secretKey, message);
前端实现(Web Crypto API)
浏览器环境下的签名方案:

async function generateKeyPair() {
return await window.crypto.subtle.generateKey(
{
name: 'RSASSA-PKCS1-v1_5',
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: 'SHA-256',
},
true,
['sign', 'verify']
);
}
async function signData(privateKey, data) {
const encoded = new TextEncoder().encode(data);
return await window.crypto.subtle.sign(
'RSASSA-PKCS1-v1_5',
privateKey,
encoded
);
}
注意事项
- RSA签名适合非对称加密场景,HMAC适合共享密钥场景
- 前端签名需考虑密钥安全存储问题,通常建议由后端完成
- 实际应用中需添加时间戳、随机数等防重放攻击机制






