Các câu trả lời hiện có sử dụng SJCL, CryptoJS và / hoặc WebCrypto không nhất thiết sai nhưng chúng không an toàn như bạn có thể nghi ngờ ban đầu. Nói chung bạn muốn sử dụng libsodium . Đầu tiên tôi sẽ giải thích tại sao, sau đó như thế nào.
Tại sao không phải là SJCL, CryptoJS, WebCrypto, v.v.?
Câu trả lời ngắn: Để mã hóa của bạn thực sự an toàn, các thư viện này hy vọng bạn có quá nhiều lựa chọn, ví dụ như chế độ mật mã khối (CBC, CTR, GCM; nếu bạn không thể biết ai trong số ba tôi vừa liệt kê là an toàn sử dụng và theo những gì trở ngại, bạn không nên gánh nặng với loại này của sự lựa chọn nào cả ).
Trừ khi chức danh công việc của bạn là kỹ sư mật mã , các tỷ lệ cược được xếp chồng lên nhau để bạn thực hiện nó một cách an toàn.
Tại sao nên tránh CryptoJS?
CryptoJS cung cấp một số khối xây dựng và mong bạn biết cách sử dụng chúng một cách an toàn. Nó thậm chí còn mặc định ở chế độ CBC ( được lưu trữ ).
Tại sao chế độ CBC xấu?
Đọc bài viết này về các lỗ hổng AES-CBC .
Tại sao nên tránh WebCrypto?
WebCrypto là một tiêu chuẩn potluck, được thiết kế bởi ủy ban, cho các mục đích trực giao với kỹ thuật mã hóa. Cụ thể, WebCrypto có nghĩa là để thay thế Flash, không cung cấp bảo mật .
Tại sao nên tránh SJCL?
Tài liệu và API công khai của SJCL yêu cầu người dùng mã hóa dữ liệu bằng mật khẩu mà con người nhớ. Điều này hiếm khi, nếu có, những gì bạn muốn làm trong thế giới thực.
Ngoài ra: Số vòng PBKDF2 mặc định của nó nhỏ hơn khoảng 86 lần so với bạn muốn . AES-128-CCM có lẽ tốt.
Trong số ba lựa chọn ở trên, SJCL ít có khả năng kết thúc trong nước mắt. Nhưng có những lựa chọn tốt hơn có sẵn.
Tại sao Libsodium tốt hơn?
Bạn không cần phải chọn giữa một menu các chế độ mật mã, hàm băm và các tùy chọn không cần thiết khác. Bạn sẽ không bao giờ mạo hiểm làm hỏng các tham số của bạn và loại bỏ tất cả bảo mật khỏi giao thức của bạn .
Thay vào đó, libsodium chỉ cung cấp cho bạn các tùy chọn đơn giản được điều chỉnh để bảo mật tối đa và API tối giản.
crypto_box()
/ crypto_box_open()
cung cấp mã hóa khóa công khai xác thực.
- Thuật toán được đề cập kết hợp X25519 (ECDH trên Curve25519) và XSalsa20-Poly1305, nhưng bạn không cần biết (hoặc thậm chí quan tâm) về điều đó để sử dụng nó một cách an toàn
crypto_secretbox()
/ crypto_secretbox_open()
cung cấp mã hóa xác thực chia sẻ khóa.
- Thuật toán được đề cập là XSalsa20-Poly1305, nhưng bạn không cần biết / quan tâm
Ngoài ra, libsodium có các ràng buộc trong hàng tá ngôn ngữ lập trình phổ biến , do đó rất có khả năng libsodium sẽ chỉ hoạt động khi cố gắng tương tác với một ngăn xếp lập trình khác. Ngoài ra, libsodium có xu hướng rất nhanh mà không mất an ninh.
Làm cách nào để sử dụng Libsodium trong JavaScript?
Đầu tiên, bạn cần quyết định một điều:
- Bạn chỉ muốn mã hóa / giải mã dữ liệu (và có thể vẫn bằng cách nào đó sử dụng bản rõ trong các truy vấn cơ sở dữ liệu một cách an toàn) và không lo lắng về các chi tiết? Hoặc là...
- Bạn có cần phải thực hiện một giao thức cụ thể?
Nếu bạn đã chọn tùy chọn đầu tiên , hãy lấy CodesSweet.js .
Các tài liệu có sẵn trực tuyến . EncryptedField
là đủ cho hầu hết các trường hợp sử dụng, nhưng API EncryptedRow
và EncryptedMultiRows
có thể dễ dàng hơn nếu bạn có nhiều trường riêng biệt bạn muốn mã hóa.
Với CodesSweet, bạn thậm chí không cần biết nonce / IV là gì để sử dụng nó một cách an toàn.
Ngoài ra, điều này xử lý int
/ float
mã hóa mà không rò rỉ sự thật về nội dung thông qua kích thước bản mã.
Mặt khác , bạn sẽ muốn sử dụng sodium-plus , một giao diện thân thiện với người dùng cho các trình bao bọc libsodium khác nhau. Sodium-Plus cho phép bạn viết mã hiệu suất, không đồng bộ, đa nền tảng, dễ kiểm toán và lý do.
Để cài đặt natri-plus, chỉ cần chạy ...
npm install sodium-plus
Hiện tại không có CDN công khai để hỗ trợ trình duyệt. Điều này sẽ thay đổi sớm. Tuy nhiên, bạn có thể lấy sodium-plus.min.js
từ bản phát hành Github mới nhất nếu bạn cần.
const { SodiumPlus } = require('sodium-plus');
let sodium;
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
let plaintext = 'Your message goes here';
let key = await sodium.crypto_secretbox_keygen();
let nonce = await sodium.randombytes_buf(24);
let ciphertext = await sodium.crypto_secretbox(
plaintext,
nonce,
key
);
console.log(ciphertext.toString('hex'));
let decrypted = await sodium.crypto_secretbox_open(
ciphertext,
nonce,
key
);
console.log(decrypted.toString());
})();
Tài liệu về natri-plus có sẵn trên Github.
Nếu bạn muốn hướng dẫn từng bước, bài viết dev.to này có những gì bạn đang tìm kiếm.