SubtleCrypto:verify() 方法

基线 广泛可用

此功能已得到完善,可在许多设备和浏览器版本上运行。它已在浏览器中可用,自 2015 年 7 月.

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在部分或全部支持的浏览器中可用。

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

它将 密钥 作为参数,用于验证签名,以及一些特定于算法的参数、签名和原始签名数据。它返回一个 Promise,该 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" } 的对象。
  • 要使用 Ed25519,请传递形式为 { "name": "Ed25519" } 的对象。
key

一个 CryptoKey,包含用于验证签名的密钥。它是一个对称算法的密钥,也是一个公钥系统的公钥。

signature

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

data

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

返回值

一个 Promise,它将以布尔值执行:true 表示签名有效,false 表示无效。

异常

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

InvalidAccessError DOMException

当加密密钥不是请求的验证算法的密钥,或者尝试使用未知算法或不适合验证操作的算法时引发。

支持的算法

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

示例

注意:您可以在 GitHub 上尝试运行示例

RSASSA-PKCS1-v1_5

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

js
/*
Fetch the contents of the "message" textbox, and encode it
in a form we can use for sign operation.
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsassa-pkcs1 #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
Fetch the encoded message-to-sign and verify it against the stored signature.
* If it checks out, set the "valid" class on the signature.
* Otherwise set the "invalid" class.
*/
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
/*
Fetch the contents of the "message" textbox, and encode it
in a form we can use for sign operation.
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-pss #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
Fetch the encoded message-to-sign and verify it against the stored signature.
* If it checks out, set the "valid" class on the signature.
* Otherwise set the "invalid" class.
*/
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
/*
Fetch the contents of the "message" textbox, and encode it
in a form we can use for sign operation.
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".ecdsa #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
Fetch the encoded message-to-sign and verify it against the stored signature.
* If it checks out, set the "valid" class on the signature.
* Otherwise set the "invalid" class.
*/
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
/*
Fetch the contents of the "message" textbox, and encode it
in a form we can use for sign operation.
*/
function getMessageEncoding() {
  const messageBox = document.querySelector(".hmac #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

/*
Fetch the encoded message-to-sign and verify it against the stored signature.
* If it checks out, set the "valid" class on the signature.
* Otherwise set the "invalid" class.
*/
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");
}

Ed25519

SubtleCrypto.sign() 中的 Ed25519 实时示例 展示了如何生成公钥和私钥,使用私钥对某些数据进行签名,然后使用公钥验证签名。

以下摘录显示了使用公钥和编码数据验证签名的相关部分

js
// Verify the signature using the public key
const verifyResult = await crypto.subtle.verify(
  {
    name: "Ed25519",
  },
  publicKey,
  signature,
  encodedData,
);
// True if the signature is valid.

规范

规范
Web 加密 API
# SubtleCrypto-method-verify

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅