SubtleCrypto.verify()
=====================

**安全上下文:** 此项功能仅在一些支持的浏览器的安全上下文（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` (en-US) 对象。
* 使用 ECDSA，则传入 `EcdsaParams` (en-US) 对象。
* 使用 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 with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `SubtleCrypto.sign()`。
* RFC 3447 规定了 RSASSA-PKCS1-v1\_5。
* RFC 3447 规定了 RSA-PSS。
* FIPS-186 规定了 ECDSA。
* FIPS 198-1 规定了 HMAC。