Làm cách nào để mã hóa dữ liệu trong JavaScript?

Nó lấy các đối số của nó làm khóa để mã hóa, một số tham số dành riêng cho thuật toán và dữ liệu để mã hóa (còn được gọi là "bản rõ"). Nó trả về một Promise sẽ được hoàn thành với dữ liệu được mã hóa (còn được gọi là "bản mã")

encrypt(algorithm, key, data)

algorithm

Một đối tượng chỉ định sẽ được sử dụng và bất kỳ tham số bổ sung nào nếu được yêu cầu

  • Để sử dụng , truyền một đối tượng
    function getMessageEncoding() {
      const messageBox = document.querySelector(".rsa-oaep #message");
      let message = messageBox.value;
      let enc = new TextEncoder();
      return enc.encode(message);
    }
    
    function encryptMessage(publicKey) {
      let encoded = getMessageEncoding();
      return window.crypto.subtle.encrypt(
        {
          name: "RSA-OAEP",
        },
        publicKey,
        encoded
      );
    }
    
    0
  • Để sử dụng , truyền một đối tượng
    function getMessageEncoding() {
      const messageBox = document.querySelector(".rsa-oaep #message");
      let message = messageBox.value;
      let enc = new TextEncoder();
      return enc.encode(message);
    }
    
    function encryptMessage(publicKey) {
      let encoded = getMessageEncoding();
      return window.crypto.subtle.encrypt(
        {
          name: "RSA-OAEP",
        },
        publicKey,
        encoded
      );
    }
    
    1
  • Để sử dụng , truyền một đối tượng
    function getMessageEncoding() {
      const messageBox = document.querySelector(".rsa-oaep #message");
      let message = messageBox.value;
      let enc = new TextEncoder();
      return enc.encode(message);
    }
    
    function encryptMessage(publicKey) {
      let encoded = getMessageEncoding();
      return window.crypto.subtle.encrypt(
        {
          name: "RSA-OAEP",
        },
        publicKey,
        encoded
      );
    }
    
    2
  • Để sử dụng , truyền một đối tượng
    function getMessageEncoding() {
      const messageBox = document.querySelector(".rsa-oaep #message");
      let message = messageBox.value;
      let enc = new TextEncoder();
      return enc.encode(message);
    }
    
    function encryptMessage(publicKey) {
      let encoded = getMessageEncoding();
      return window.crypto.subtle.encrypt(
        {
          name: "RSA-OAEP",
        },
        publicKey,
        encoded
      );
    }
    
    3
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded
  );
}
4

Một

function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded
  );
}
5 chứa khóa được sử dụng để mã hóa

function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded
  );
}
6

Một

function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded
  );
}
7, một
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded
  );
}
8 hoặc một
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded
  );
}
9 chứa dữ liệu sẽ được mã hóa (còn được gọi là văn bản gốc)

Một Promise đáp ứng với một

function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded
  );
}
7 chứa "bản mã"

Lời hứa bị từ chối khi gặp phải các ngoại lệ sau

function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-ctr #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  let encoded = getMessageEncoding();
  // counter will be needed for decryption
  counter = window.crypto.getRandomValues(new Uint8Array(16));
  return window.crypto.subtle.encrypt(
    {
      name: "AES-CTR",
      counter,
      length: 64,
    },
    key,
    encoded
  );
}
2
function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-ctr #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  let encoded = getMessageEncoding();
  // counter will be needed for decryption
  counter = window.crypto.getRandomValues(new Uint8Array(16));
  return window.crypto.subtle.encrypt(
    {
      name: "AES-CTR",
      counter,
      length: 64,
    },
    key,
    encoded
  );
}
3

Xảy ra khi thao tác được yêu cầu không hợp lệ đối với khóa được cung cấp (e. g. thuật toán mã hóa không hợp lệ hoặc khóa không hợp lệ cho thuật toán mã hóa đã chỉ định)

function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-ctr #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  let encoded = getMessageEncoding();
  // counter will be needed for decryption
  counter = window.crypto.getRandomValues(new Uint8Array(16));
  return window.crypto.subtle.encrypt(
    {
      name: "AES-CTR",
      counter,
      length: 64,
    },
    key,
    encoded
  );
}
4
function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-ctr #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  let encoded = getMessageEncoding();
  // counter will be needed for decryption
  counter = window.crypto.getRandomValues(new Uint8Array(16));
  return window.crypto.subtle.encrypt(
    {
      name: "AES-CTR",
      counter,
      length: 64,
    },
    key,
    encoded
  );
}
3

Tăng lên khi hoạt động không thành công vì lý do hoạt động cụ thể (e. g. thông số thuật toán có kích thước không hợp lệ hoặc văn bản gốc AES-GCM dài hơn 239−256 byte)

Web Crypto API cung cấp bốn thuật toán hỗ trợ các hoạt động encrypt()

function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-ctr #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  let encoded = getMessageEncoding();
  // counter will be needed for decryption
  counter = window.crypto.getRandomValues(new Uint8Array(16));
  return window.crypto.subtle.encrypt(
    {
      name: "AES-CTR",
      counter,
      length: 64,
    },
    key,
    encoded
  );
}
7

Một trong những thuật toán này - RSA-OAEP - là một hệ thống mật mã khóa công khai

Ba thuật toán mã hóa khác ở đây đều là thuật toán đối xứng và tất cả chúng đều dựa trên cùng một mật mã cơ bản, AES (Tiêu chuẩn mã hóa nâng cao). Sự khác biệt giữa chúng là chế độ. Web Crypto API hỗ trợ ba chế độ AES khác nhau

  • CTR (Chế độ truy cập)
  • CBC (Chuỗi khối mật mã)
  • GCM (Chế độ Galois/Bộ đếm)

Bạn nên sử dụng mã hóa được xác thực, bao gồm các kiểm tra để đảm bảo rằng bản mã không bị kẻ tấn công sửa đổi. Xác thực giúp bảo vệ chống lại các cuộc tấn công bằng bản mã đã chọn, trong đó kẻ tấn công có thể yêu cầu hệ thống giải mã các thông báo tùy ý và sử dụng kết quả để suy ra thông tin về khóa bí mật. Mặc dù có thể thêm xác thực vào chế độ CTR và CBC, nhưng chúng không cung cấp tính năng này theo mặc định và khi triển khai tính năng này theo cách thủ công, người ta có thể dễ dàng mắc các lỗi nhỏ nhưng nghiêm trọng. GCM cung cấp xác thực tích hợp và vì lý do này, nó thường được khuyến nghị hơn hai chế độ AES khác

Hệ thống mã hóa khóa công khai RSA-OAEP được chỉ định trong RFC 3447

Điều này đại diện cho AES trong Chế độ bộ đếm, như được chỉ định trong NIST SP800-38A

AES là một mật mã khối, nghĩa là nó chia thông điệp thành các khối và mã hóa từng khối một. Ở chế độ CTR, mỗi khi một khối tin nhắn được mã hóa, một khối dữ liệu bổ sung sẽ được trộn vào. Khối bổ sung này được gọi là "khối truy cập"

Giá trị khối bộ đếm đã cho không bao giờ được sử dụng nhiều lần với cùng một khóa

  • Với một thông báo dài n khối, một khối truy cập khác phải được sử dụng cho mỗi khối
  • Nếu cùng một khóa được sử dụng để mã hóa nhiều tin nhắn, thì phải sử dụng một khối bộ đếm khác cho tất cả các khối trên tất cả các tin nhắn

Thông thường, điều này đạt được bằng cách chia giá trị khối bộ đếm ban đầu thành hai phần được nối

  • Số nonce (nghĩa là số chỉ được sử dụng một lần). Phần nonce của khối giữ nguyên cho mọi khối trong tin nhắn. Mỗi khi một tin nhắn mới được mã hóa, một nonce mới được chọn. Nonce không cần phải bí mật, nhưng chúng không được sử dụng lại với cùng một khóa
  • một quầy. Phần này của khối được tăng lên mỗi khi một khối được mã hóa

Thiết yếu. nonce phải đảm bảo rằng các khối bộ đếm không được sử dụng lại từ một tin nhắn này sang tin nhắn tiếp theo, trong khi bộ đếm phải đảm bảo rằng các khối bộ đếm không được sử dụng lại trong một tin nhắn

Ghi chú. Xem để biết thêm thông tin

Điều này đại diện cho AES trong Chế độ chuỗi khối mật mã, như được chỉ định trong NIST SP800-38A

Điều này đại diện cho AES trong Chế độ Galois/Bộ đếm, như được chỉ định trong NIST SP800-38D

Một điểm khác biệt chính giữa chế độ này và các chế độ khác là GCM là chế độ "được xác thực", có nghĩa là nó bao gồm các kiểm tra để đảm bảo rằng bản mã không bị kẻ tấn công sửa đổi

Ghi chú. Bạn có thể thử các ví dụ hoạt động trên GitHub

Mã này tìm nạp nội dung của hộp văn bản, mã hóa nó để mã hóa và mã hóa nó bằng AES ở chế độ GCM. Xem mã hoàn chỉnh trên GitHub

Làm cách nào để mã hóa và giải mã dữ liệu trong js?

Để giải mã bản mã trở lại thành tin nhắn văn bản thuần túy ban đầu, chúng ta có thể sử dụng chức năng giải mã sau. const decrypted = CryptoJS. AES. giải mã(mã hóa, khóa);

Làm cách nào để mã hóa mật khẩu bằng JavaScript?

Để mã hóa phía máy khách, bạn phải sử dụng hai javascript. Trong biểu mẫu này, tôi đã tạo một trường mật khẩu và một trường ẩn. Trường ẩn được sử dụng để giữ giá trị của mật khẩu thực. Trong javascript trên, tôi đã tạo một hàm mã hóa() .

Làm cách nào để mã hóa dữ liệu người dùng trong JavaScript?

Mã hóa đối tượng .
dữ liệu var = [{ foo. thanh}, { thanh. foo}];
var ciphertext = CryptoJS. AES. mã hóa (JSON. stringify(dữ liệu), 'khóa bí mật 123');
var byte = CryptoJS. AES. giải mã (bản mã. toString(), 'khóa bí mật 123');
var decryptedData = JSON. phân tích cú pháp (byte. toString(CryptoJS. enc. UTF8));

JavaScript có tốt cho mã hóa không?

Khá an toàn . Ưu điểm của việc sử dụng javascript của trình duyệt là công việc được thực hiện trên máy khách, do đó mã hóa có thể được thực hiện từ đầu đến cuối và khóa không bao giờ cần rời khỏi máy cục bộ.