当前位置:首页 > JavaScript

js 实现签名

2026-04-05 11:46:11JavaScript

使用 Web Crypto API 实现签名

Web Crypto API 是现代浏览器提供的加密接口,支持多种签名算法(如 RSA-PSS、ECDSA、HMAC)。以下示例使用 HMAC-SHA256 进行签名:

js 实现签名

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 等算法:

js 实现签名

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、时间戳、随机数等机制增强签名安全性。

标签: js
分享给朋友:

相关文章

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js实现同步

js实现同步

同步与异步的概念 在JavaScript中,同步代码会按照顺序执行,每一行代码必须等待上一行代码执行完成后才能运行。异步代码则允许在等待某些操作(如网络请求)完成的同时继续执行其他代码。 实现同步的…

js实现隐藏div

js实现隐藏div

隐藏div的几种方法 使用JavaScript隐藏div元素可以通过多种方式实现,以下是几种常见的方法: 方法一:修改style.display属性 将div的display属性设置为"none"…