SubtleCrypto: метод verify()
Базовая широко доступная *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
* Некоторые части этой функции могут иметь разную степень поддержки.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS), в некоторых или всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод verify() интерфейса SubtleCrypto проверяет цифровую подпись.
Он принимает в качестве аргументов ключ для проверки подписи, параметры, зависящие от алгоритма, саму подпись и исходные подписанные данные. Он возвращает 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" }. - Для использования Ed25519, передайте объект вида
{ "name": "Ed25519" }.
- Для использования RSASSA-PKCS1-v1_5, передайте строку
key-
CryptoKeyсодержащий ключ, который будет использоваться для проверки подписи. Это секретный ключ для симметричного алгоритма и открытый ключ для криптосистемы с открытым ключом. signature-
ArrayBufferсодержащий подпись для проверки. data-
ArrayBufferсодержащий данные, подпись которых должна быть проверена.
Возвращаемое значение
Promise, который выполняется с булевым значением: true если подпись действительна, false в противном случае.
Исключения
Обещание отклоняется, когда возникает следующая ошибка:
-
InvalidAccessErrorDOMException -
Возникает, когда ключ шифрования не является ключом для запрошенного алгоритма проверки или когда используется алгоритм, который неизвестен или не подходит для операции проверки.
Поддерживаемые алгоритмы
Метод verify() поддерживает те же алгоритмы, что и метод sign().
Примеры
Примечание: Вы можете попробовать рабочие примеры на GitHub.
RSASSA-PKCS1-v1_5
Этот код использует открытый ключ для проверки подписи. Полный код см. на GitHub.
/*
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.
/*
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.
/*
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.
/*
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
В живом примере Ed25519 в SubtleCrypto.sign() показано, как сгенерировать открытый и закрытый ключи, использовать закрытый ключ для подписи данных, а затем использовать открытый ключ для проверки подписи.
Ниже приведён фрагмент, относящийся к проверке подписи с помощью открытого ключа и закодированных данных:
// Verify the signature using the public key
const verifyResult = await crypto.subtle.verify(
{
name: "Ed25519",
},
publicKey,
signature,
encodedData,
);
// True if the signature is valid.
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
verify |
37 | 7912–79Не поддерживается: RSA-PSS, ECDSA. |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
ed25519 |
113 | 113 | 129 | 99 | 17 | 113 | 129 | Нет | 17 | Нет | Нет |
См. также
-
SubtleCrypto.sign(). - RFC 3447 определяет RSASSA-PKCS1-v1_5.
- RFC 3447 определяет RSA-PSS.
- FIPS-186 определяет ECDSA.
- FIPS 198-1 определяет HMAC.
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify