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.

安全上下文: 此项功能仅在一些支持的浏览器安全上下文(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

浏览器兼容性

BCD tables only load in the browser

参见