js 实现签名
使用 Web Crypto API 实现签名
Web Crypto API 是现代浏览器提供的加密接口,支持多种签名算法(如 RSA-PSS、ECDSA、HMAC)。以下示例使用 HMAC-SHA256 进行签名:
async function generateHMACSignature(message, secretKey) {
const encoder = new TextEncoder();
const encodedMessage = encoder.encode(message);
const encodedKey = encoder.encode(secretKey);
const cryptoKey = await crypto.subtle.importKey(
'raw',
encodedKey,
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
);
const signature = await crypto.subtle.sign('HMAC', cryptoKey, encodedMessage);
return Array.from(new Uint8Array(signature)).map(b => b.toString(16).padStart(2, '0')).join('');
}
使用 Node.js 的 crypto 模块
Node.js 内置的 crypto 模块提供更完整的签名功能,支持 RSA、ECDSA 等算法:
const crypto = require('crypto');
function signWithRSA(data, privateKey) {
const signer = crypto.createSign('RSA-SHA256');
signer.update(data);
return signer.sign(privateKey, 'base64');
}
第三方库实现
对于需要更多功能的场景,可以使用 jsrsasign 等第三方库:
const KJUR = require('jsrsasign');
function signWithECDSA(data, privateKey) {
const sig = new KJUR.crypto.Signature({ alg: 'SHA256withECDSA' });
sig.init(privateKey);
sig.updateString(data);
return sig.sign();
}
前端常见场景实现
前端签名常用于 API 请求验证,以下示例展示如何为请求添加签名:

async function addRequestSignature(url, params, secret) {
const sortedParams = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&');
const signStr = `${url}?${sortedParams}${secret}`;
return await generateHMACSignature(signStr, secret);
}
注意事项
- 密钥管理:永远不要在前端硬编码或暴露敏感密钥
- 算法选择:根据安全需求选择适当算法(如 HMAC 适合对称加密,RSA/ECDSA 适合非对称场景)
- 编码处理:注意不同环境下的编码一致性(如 UTF-8 编码)
- 浏览器兼容性:Web Crypto API 需要较新浏览器版本
对于生产环境,建议结合 HTTPS、时间戳、随机数等机制增强签名安全性。






