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.
SubtleCrypto
接口的 verify()
方法用于验证数字签名。
其以一个用于验证签名的密钥、一些特定于算法的参数、签名和原始的已签名数据为参数。返回一个 Promise
,会兑现一个布尔值,表示签名是否有效。
语法
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" }
的对象。
- 使用 RSASSA-PKCS1-v1_5,则传入字符串
key
-
一个包含了用于验证签名的密钥的
CryptoKey
对象。若是对称加密算法,则为密钥本身;若是非对称加密算法,则为公钥。 signature
-
一个包含了要验证的签名的
ArrayBuffer
。 data
-
一个包含了要验证其签名的数据的
ArrayBuffer
。
返回值
一个 Promise
,如果签名有效,则兑现布尔值 true
,否则兑现 false
。
异常
当遇到以下异常时,promise 将被拒绝:
InvalidAccessError
DOMException
-
当加密密钥不是所给定的验证算法的密钥,或尝试使用未知或不适用于验证签运算的算法时,将抛出该异常。
支持的算法
verify()
方法支持的算法与 sign()
方法所支持的相同。
method.
示例
备注: 你可以在 Github 上尝试可用的示例。
RSASSA-PKCS1-v1_5
这个示例使用公钥验证签名。在 GitHub 上查看完整代码。
/*
从“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 上查看完整代码。
/*
从“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 上查看完整代码。
/*
从“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 上查看完整代码。
/*
从“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
参见
SubtleCrypto.sign()
。- RFC 3447 规定了 RSASSA-PKCS1-v1_5。
- RFC 3447 规定了 RSA-PSS。
- FIPS-186 规定了 ECDSA。
- FIPS 198-1 规定了 HMAC。