×

Cách sử dụng thẻ <keygen> để tạo cặp khóa bảo mật trong HTML

Trong lập trình web, việc bảo mật luôn là một yếu tố quan trọng. Một trong những phương pháp hiệu quả để bảo mật thông tin chính là sử dụng cặp khóa công khai và khóa riêng. Trong HTML, thẻ <keygen> đã từng được sử dụng để tự động tạo ra cặp khóa bảo mật này. Tuy nhiên, điều quan trọng cần biết là việc sử dụng thẻ <keygen> hiện không còn được khuyến nghị do đã bị loại bỏ khỏi các phiên bản mới của HTML vì lí do bảo mật và tương thích.

Tổng Quan về Thẻ <keygen>

Trước đây, thẻ <keygen> trong HTML được sử dụng để tạo ra cặp khóa công khai và khóa riêng, thường trong các ứng dụng web cần đến mã hóa dữ liệu. Thẻ này hoạt động như một cơ chế để tạo ra mật mã công khai có thể được gửi đến máy chủ cùng với yêu cầu form.

Cách Thức Hoạt Động

Thẻ <keygen> được đặt bên trong một thẻ <form> và khi form được gửi, cặp khóa sẽ được tạo ra. Dưới đây là một ví dụ về cách thẻ này từng được sử dụng:

<form action="/submit-public-key" method="post">
  <label for="name">Name:</label>
  <input type="text" id="name" name="name">
  
  <keygen name="keypair">
  
  <input type="submit" value="Submit">
</form>

Khi form này được gửi, trình duyệt sẽ tạo ra một cặp khóa công khai và riêng. Khóa công khai sẽ được gửi tới máy chủ như một phần của dữ liệu form dưới tên được chỉ định (trong trường hợp này là "keypair"). Khóa riêng sẽ được lưu lại trong trình duyệt của người dùng.

Các Vấn Đề và Giải Pháp Thay Thế

Do các vấn đề về bảo mật và hỗ trợ không đồng nhất giữa các trình duyệt, <keygen> đã bị loại bỏ khỏi HTML5. Để thay thế, các nhà phát triển web được khuyến khích sử dụng các thư viện mã hóa JavaScript hoặc các API bảo mật hiện đại hơn như Web Cryptography API.

Web Cryptography API

Web Cryptography API cung cấp một bộ công cụ phong phú cho các thao tác mã hóa và tạo cặp khóa công khai/riêng trong môi trường trình duyệt. Một ví dụ đơn giản về tạo cặp khóa với API này như sau:

window.crypto.subtle.generateKey(
    {
        name: "RSASSA-PKCS1-v1_5",
        modulusLength: 2048,
        publicExponent: new Uint8Array([1, 0, 1]),
        hash: { name: "SHA-256" },
    },
    true,
    ["sign", "verify"]
).then(function(keyPair) {
    // Xuất khóa công khai
    return window.crypto.subtle.exportKey("spki", keyPair.publicKey);
}).then(function(exportedPublicKey) {
    // Biểu diễn trong định dạng PEM
    let pemContents = `-----BEGIN PUBLIC KEY-----\n${btoa(String.fromCharCode(...new Uint8Array(exportedPublicKey)))}\n-----END PUBLIC KEY-----`;
    console.log(pemContents);
}).catch(function(err){
    console.error(err);
});

Đoạn mã trên sẽ tạo ra một cặp khóa RSA với một mô-đun 2048 bit và hàm băm SHA-256. Khóa công khai sau đó được xuất và biểu diễn dưới dạng PEM.

Kết Luận

Mặc dù thẻ <keygen> từng là một công cụ hữu ích cho việc tạo cặp khóa bảo mật trong HTML, những tiến bộ trong công nghệ web đã mang lại các giải pháp hiệu quả và an toàn hơn. Sử dụng Web Cryptography API là một phương pháp đáng tin cậy và linh hoạt để thực hiện các thao tác mã hóa và bảo vệ dữ liệu trong các ứng dụng web hiện đại.

Comments