SubtleCrypto.verify()

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

* Some parts of this feature may have varying levels of support.

安全上下文: 此项功能仅在一些支持的浏览器安全上下文(HTTPS)中可用。

SubtleCrypto 接口的 verify() 方法用于验证数字签名

其以一个用于验证签名的密钥、一些特定于算法的参数、签名和原始的已签名数据为参数。返回一个 Promise,会兑现一个布尔值,表示签名是否有效。

语法

js
verify(algorithm, key, signature, data)

参数

algorithm

定义要使用的算法的字符串或对象,对于某些算法,还需要提供一些额外的参数。额外提供的参数的值必须与对应的 sign() 调用所传入的值相匹配。

  • 使用 RSASSA-PKCS1-v1_5,则传入字符串 "RSASSA-PKCS1-v1_5" 或形如 { "name": "RSASSA-PKCS1-v1_5" } 的对象。
  • 使用 RSA-PSS,则传入 RsaPssParams 对象。
  • 使用 ECDSA,则传入 EcdsaParams 对象。
  • 使用 HMAC,则传入字符串 "HMAC" 或形如 { "name": "HMAC" } 的对象。
key

一个包含了用于验证签名的密钥的 CryptoKey 对象。若是对称加密算法,则为密钥本身;若是非对称加密算法,则为公钥。

signature

一个包含了要验证的签名ArrayBuffer

data

一个包含了要验证其签名的数据的 ArrayBuffer

返回值

一个 Promise,如果签名有效,则兑现布尔值 true,否则兑现 false

异常

当遇到以下异常时,promise 将被拒绝:

InvalidAccessError DOMException

当加密密钥不是所给定的验证算法的密钥,或尝试使用未知或不适用于验证签运算的算法时,将抛出该异常。

支持的算法

verify() 方法支持的算法与 sign() 方法所支持的相同。 method.

示例

备注: 你可以在 Github 上尝试可用的示例

RSASSA-PKCS1-v1_5

这个示例使用公钥验证签名。在 GitHub 上查看完整代码。

js
/*
从“message”文本框获取内容,并将其编码为
我们可用于签名运算的形式。
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsassa-pkcs1 #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
获取编码后的待签名消息,并根据存储的签名对其进行验证。
* 如果验证通过,则在签名上设置“valid”样式类。
* 否则设置“invalid”样式类。
*/
async function verifyMessage(publicKey) {
  const signatureValue = document.querySelector(
    ".rsassa-pkcs1 .signature-value",
  );
  signatureValue.classList.remove("valid", "invalid");

  let encoded = getMessageEncoding();
  let result = await window.crypto.subtle.verify(
    "RSASSA-PKCS1-v1_5",
    publicKey,
    signature,
    encoded,
  );

  signatureValue.classList.add(result ? "valid" : "invalid");
}

RSA-PSS

以下代码使用公钥来验证签名。在 GitHub 上查看完整代码。

js
/*
从“message”文本框获取内容,并将其编码为
我们可用于签名运算的形式。
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-pss #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
获取编码后的待签名消息,并根据存储的签名对其进行验证。
* 如果验证通过,则在签名上设置“valid”样式类。
* 否则设置“invalid”样式类。
*/
async function verifyMessage(publicKey) {
  const signatureValue = document.querySelector(".rsa-pss .signature-value");
  signatureValue.classList.remove("valid", "invalid");

  let encoded = getMessageEncoding();
  let result = await window.crypto.subtle.verify(
    {
      name: "RSA-PSS",
      saltLength: 32,
    },
    publicKey,
    signature,
    encoded,
  );

  signatureValue.classList.add(result ? "valid" : "invalid");
}

ECDSA

以下代码使用公钥来验证签名。在 GitHub 上查看完整代码。

js
/*
从“message”文本框获取内容,并将其编码为
我们可用于签名运算的形式。
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".ecdsa #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
获取编码后的待签名消息,并根据存储的签名对其进行验证。
* 如果验证通过,则在签名上设置“valid”样式类。
* 否则设置“invalid”样式类。
*/
async function verifyMessage(publicKey) {
  const signatureValue = document.querySelector(".ecdsa .signature-value");
  signatureValue.classList.remove("valid", "invalid");

  let encoded = getMessageEncoding();
  let result = await window.crypto.subtle.verify(
    {
      name: "ECDSA",
      hash: { name: "SHA-384" },
    },
    publicKey,
    signature,
    encoded,
  );

  signatureValue.classList.add(result ? "valid" : "invalid");
}

HMAC

以下代码使用密钥来验证签名。在 GitHub 上查看完整代码。

js
/*
从“message”文本框获取内容,并将其编码为
我们可用于签名运算的形式。
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".hmac #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
获取编码后的待签名消息,并根据存储的签名对其进行验证。
* 如果验证通过,则在签名上设置“valid”样式类。
* 否则设置“invalid”样式类。
*/
async function verifyMessage(key) {
  const signatureValue = document.querySelector(".hmac .signature-value");
  signatureValue.classList.remove("valid", "invalid");

  let encoded = getMessageEncoding();
  let result = await window.crypto.subtle.verify(
    "HMAC",
    key,
    signature,
    encoded,
  );

  signatureValue.classList.add(result ? "valid" : "invalid");
}

规范

Specification
Web Cryptography API
# SubtleCrypto-method-verify

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
verify
Ed25519 algorithm

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
Partial support
Partial support
No support
No support
See implementation notes.
User must explicitly enable this feature.
Has more compatibility info.

参见