SubtleCrypto: phương thức verify()
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.
* Some parts of this feature may have varying levels of support.
Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.
Note: This feature is available in Web Workers.
Phương thức verify() của giao diện SubtleCrypto xác minh một signature số.
Nó nhận làm đối số một key để xác minh chữ ký, một số tham số cụ thể cho thuật toán, chữ ký, và dữ liệu đã ký ban đầu.
Nó trả về một Promise sẽ được fulfill với giá trị boolean cho biết chữ ký có hợp lệ hay không.
Cú pháp
verify(algorithm, key, signature, data)
Tham số
algorithm-
Một chuỗi hoặc đối tượng xác định thuật toán sẽ sử dụng, và với một số lựa chọn thuật toán, một số tham số bổ sung. Các giá trị được truyền cho các tham số bổ sung phải khớp với những giá trị đã truyền vào lệnh gọi
sign()tương ứng.- Để sử dụng RSASSA-PKCS1-v1_5,
truyền chuỗi
"RSASSA-PKCS1-v1_5"hoặc một đối tượng có dạng{ "name": "RSASSA-PKCS1-v1_5" }. - Để sử dụng RSA-PSS, truyền một đối tượng
RsaPssParams. - Để sử dụng ECDSA, truyền một đối tượng
EcdsaParams. - Để sử dụng HMAC, truyền chuỗi
"HMAC"hoặc một đối tượng có dạng{ "name": "HMAC" }. - Để sử dụng Ed25519, truyền một đối tượng có dạng
{ "name": "Ed25519" }.
- Để sử dụng RSASSA-PKCS1-v1_5,
truyền chuỗi
key-
Một
CryptoKeychứa khóa sẽ dùng để xác minh chữ ký. Đây là khóa bí mật đối với thuật toán đối xứng và khóa công khai đối với hệ mật mã khóa công khai. signature-
Một
ArrayBufferchứa signature cần xác minh. data-
Một
ArrayBufferchứa dữ liệu có chữ ký cần xác minh.
Giá trị trả về
Một Promise được fulfill với một giá trị boolean: true nếu chữ ký hợp lệ, false nếu ngược lại.
Ngoại lệ
Promise bị reject khi gặp ngoại lệ sau:
InvalidAccessErrorDOMException-
Ném lên khi khóa mã hóa không phải là khóa cho thuật toán xác minh được yêu cầu hoặc khi cố sử dụng một thuật toán không xác định hoặc không phù hợp cho thao tác xác minh.
Các thuật toán được hỗ trợ
Phương thức verify() hỗ trợ các thuật toán tương tự như phương thức sign().
Ví dụ
Note: Bạn có thể thử các ví dụ hoạt động trên GitHub.
RSASSA-PKCS1-v1_5
Đoạn mã này sử dụng khóa công khai để xác minh một chữ ký. Xem mã đầy đủ trên GitHub.
/*
Lấy nội dung của hộp văn bản "message", và mã hóa nó
thành dạng chúng ta có thể sử dụng cho thao tác ký.
*/
function getMessageEncoding() {
const messageBox = document.querySelector(".rsassa-pkcs1 #message");
let message = messageBox.value;
let enc = new TextEncoder();
return enc.encode(message);
}
/*
Lấy thông báo đã mã hóa cần ký và xác minh nó với chữ ký đã lưu.
* Nếu hợp lệ, đặt lớp "valid" trên chữ ký.
* Ngược lại đặt lớp "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
Đoạn mã này sử dụng khóa công khai để xác minh một chữ ký. Xem mã đầy đủ trên GitHub.
/*
Lấy nội dung của hộp văn bản "message", và mã hóa nó
thành dạng chúng ta có thể sử dụng cho thao tác ký.
*/
function getMessageEncoding() {
const messageBox = document.querySelector(".rsa-pss #message");
let message = messageBox.value;
let enc = new TextEncoder();
return enc.encode(message);
}
/*
Lấy thông báo đã mã hóa cần ký và xác minh nó với chữ ký đã lưu.
* Nếu hợp lệ, đặt lớp "valid" trên chữ ký.
* Ngược lại đặt lớp "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
Đoạn mã này sử dụng khóa công khai để xác minh một chữ ký. Xem mã đầy đủ trên GitHub.
/*
Lấy nội dung của hộp văn bản "message", và mã hóa nó
thành dạng chúng ta có thể sử dụng cho thao tác ký.
*/
function getMessageEncoding() {
const messageBox = document.querySelector(".ecdsa #message");
let message = messageBox.value;
let enc = new TextEncoder();
return enc.encode(message);
}
/*
Lấy thông báo đã mã hóa cần ký và xác minh nó với chữ ký đã lưu.
* Nếu hợp lệ, đặt lớp "valid" trên chữ ký.
* Ngược lại đặt lớp "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
Đoạn mã này sử dụng khóa bí mật để xác minh một chữ ký. Xem mã đầy đủ trên GitHub.
/*
Lấy nội dung của hộp văn bản "message", và mã hóa nó
thành dạng chúng ta có thể sử dụng cho thao tác ký.
*/
function getMessageEncoding() {
const messageBox = document.querySelector(".hmac #message");
let message = messageBox.value;
let enc = new TextEncoder();
return enc.encode(message);
}
/*
Lấy thông báo đã mã hóa cần ký và xác minh nó với chữ ký đã lưu.
* Nếu hợp lệ, đặt lớp "valid" trên chữ ký.
* Ngược lại đặt lớp "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");
}
Ed25519
Ví dụ trực tiếp Ed25519 trong SubtleCrypto.sign() cho thấy cách tạo khóa công khai và khóa riêng tư, sử dụng khóa riêng tư để ký dữ liệu, rồi sử dụng khóa công khai để xác minh chữ ký.
Đoạn trích dưới đây cho thấy phần liên quan đến việc xác minh chữ ký bằng khóa công khai và dữ liệu đã mã hóa:
// Verify the signature using the public key
const verifyResult = await crypto.subtle.verify(
{
name: "Ed25519",
},
publicKey,
signature,
encodedData,
);
// True nếu chữ ký hợp lệ.
Đặc tả kỹ thuật
| Specification |
|---|
| Web Cryptography Level 2> # SubtleCrypto-method-verify> |
Tương thích trình duyệt
Xem thêm
SubtleCrypto.sign().- RFC 3447 chỉ định RSASSA-PKCS1-v1_5.
- RFC 3447 chỉ định RSA-PSS.
- FIPS-186 chỉ định ECDSA.
- FIPS 198-1 chỉ định HMAC.