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

js
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" }.
key

Một CryptoKey chứ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 ArrayBuffer chứa signature cần xác minh.

data

Một ArrayBuffer chứ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:

InvalidAccessError DOMException

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.

js
/*
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.

js
/*
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.

js
/*
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.

js
/*
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:

js
// 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