当前位置:首页 > JavaScript

js 实现签名

2026-01-31 19:30:30JavaScript

实现数字签名(JavaScript)

使用Web Crypto API实现RSA-PSS签名:

async function generateKeyPair() {
  return await window.crypto.subtle.generateKey(
    {
      name: "RSA-PSS",
      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(
    {
      name: "RSA-PSS",
      saltLength: 32
    },
    privateKey,
    encoded
  );
}

实现Canvas手写签名

创建基于Canvas的签名板:

const canvas = document.getElementById('signatureCanvas');
const ctx = canvas.getContext('2d');
let isDrawing = false;

canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', endDrawing);
canvas.addEventListener('mouseout', endDrawing);

function startDrawing(e) {
  isDrawing = true;
  ctx.beginPath();
  ctx.moveTo(e.offsetX, e.offsetY);
}

function draw(e) {
  if (!isDrawing) return;
  ctx.lineTo(e.offsetX, e.offsetY);
  ctx.stroke();
}

function endDrawing() {
  isDrawing = false;
}

function saveSignature() {
  const dataURL = canvas.toDataURL('image/png');
  localStorage.setItem('signature', dataURL);
}

使用第三方库(signature_pad)

安装签名库:

npm install signature_pad

基本实现:

js 实现签名

import SignaturePad from 'signature_pad';

const canvas = document.getElementById('signature-pad');
const signaturePad = new SignaturePad(canvas);

document.getElementById('save').addEventListener('click', () => {
  if (signaturePad.isEmpty()) {
    alert('请先提供签名');
  } else {
    const dataURL = signaturePad.toDataURL();
    console.log(dataURL);
  }
});

document.getElementById('clear').addEventListener('click', () => {
  signaturePad.clear();
});

验证数字签名

验证RSA-PSS签名示例:

async function verifySignature(publicKey, signature, data) {
  const encoded = new TextEncoder().encode(data);
  return await window.crypto.subtle.verify(
    {
      name: "RSA-PSS",
      saltLength: 32
    },
    publicKey,
    signature,
    encoded
  );
}

签名数据格式化

将ArrayBuffer签名转为Base64:

js 实现签名

function arrayBufferToBase64(buffer) {
  let binary = '';
  const bytes = new Uint8Array(buffer);
  for (let i = 0; i < bytes.byteLength; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return window.btoa(binary);
}

注意事项

浏览器兼容性检查:

if (!window.crypto || !window.crypto.subtle) {
  console.error('Web Crypto API not supported');
}

Canvas签名建议设置样式:

#signatureCanvas {
  border: 1px solid #000;
  background-color: #f8f8f8;
}

移动端触摸支持需要添加事件监听:

canvas.addEventListener('touchstart', handleTouchStart);
canvas.addEventListener('touchmove', handleTouchMove);

标签: js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现验证码

js实现验证码

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

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…