SubtleCrypto:verify() 方法
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" }
的对象。
- 要使用 RSASSA-PKCS1-v1_5,请传递字符串
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 的浏览器中加载。
另请参阅
SubtleCrypto.sign()
.- RFC 3447 指定 RSASSA-PKCS1-v1_5。
- RFC 3447 指定 RSA-PSS。
- FIPS-186 指定 ECDSA。
- FIPS 198-1 指定 HMAC。