当前位置:首页 > 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

基本实现:

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:

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;
}

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

js 实现签名

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

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…