当前位置:首页 > JavaScript

js实现签名

2026-04-06 14:17:27JavaScript

实现数字签名(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)

浏览器环境下的签名方案:

js实现签名

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适合共享密钥场景
  • 前端签名需考虑密钥安全存储问题,通常建议由后端完成
  • 实际应用中需添加时间戳、随机数等防重放攻击机制

标签: js
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…