Hướng dẫn encrypt data in javascript - mã hóa dữ liệu bằng javascript

Các câu trả lời hiện có tận dụng SJCL, CryptoJS và / hoặc WebCrypto không nhất thiết là 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 lý do tại sao, sau đó làm thế nào.

Tại sao không phải là SJCL, CryptoJS, WebCrypto, v.v.?

Câu trả lời ngắn gọn: Để mã hóa của bạn thực sự được bảo mật, các thư viện này yêu cầu bạn đưa ra 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 cái nào trong ba chế độ 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ả ). Để mã hóa của bạn thực sự được bảo mật, các thư viện này yêu cầu bạn đưa ra 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 cái nào trong ba chế độ 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ã , tỷ lệ cược được xếp chồng lên nhau đối với việc bạn triển khai 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 (đã lưu trữ ).

Tại sao chế độ CBC lại tệ?

Đọ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ật mã. Cụ thể, WebCrypto nhằm thay thế Flash chứ không phải cung cấp bảo mật .

Tại sao phải 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 do con người ghi nhớ. Điều này hiếm khi xảy ra, nếu có, bạn muốn làm gì 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 bạn muốn . AES-128-CCM có lẽ ổn.

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ất. Nhưng có những lựa chọn tốt hơn có sẵn.

Tại sao Libsodium lại tốt hơn?

Bạn không cần phải chọn giữa 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ờ có nguy cơ vặn các thông số của mình và xóa tất cả bảo mật khỏi giao thức của mình .

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à các 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 được xác thực bằng khóa chia sẻ.
    • 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 chục ngôn ngữ lập trình phổ biến , vì vậy rất có thể 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 ảnh hưởng đến tính bảo mật.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 ảnh hưởng đến tính bảo mật.

Làm thế nào để sử dụng Libsodium trong JavaScript?

Trước tiên, bạn cần quyết định một điều:

  1. Bạn chỉ muốn mã hóa / giải mã dữ liệu (và có thể bằng cách nào đó vẫn 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à...
  2. Bạn có cần triển khai một giao thức cụ thể không?

Nếu bạn đã chọn tùy chọn đầu tiên , hãy tải CipherSweet.js . , hãy tải CipherSweet.js .

Tài liệu có sẵn trực tuyến . EncryptedFieldlà đủ cho hầu hết các trường hợp sử dụng, nhưng API EncryptedRowEncryptedMultiRowscó thể dễ dàng hơn nếu bạn có nhiều trường riêng biệt mà bạn muốn mã hóa.

Với CipherSweet, 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/

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());
})();
0mã hóa mà không làm rò rỉ thông tin về nội dung thông qua kích thước bản mã.

Nếu không, bạn sẽ muốn natri-plus , một giao diện người dùng thân thiện với các loại giấy gói libsodium khác nhau. Sodium-Plus cho phép bạn viết mã đa nền tảng hiệu quả, không đồng bộ, dễ kiểm tra và suy luận. một giao diện người dùng thân thiện với các loại giấy gói libsodium khác nhau. Sodium-Plus cho phép bạn viết mã đa nền tảng hiệu quả, không đồng bộ, dễ kiểm tra và suy luận.

Để cài đặt sodium-plus, chỉ cần chạy ...

npm install sodium-plus

Hiện tại không có CDN công khai nào để hỗ trợ trình duyệt. Điều này sẽ sớm thay đổi. Tuy nhiên, bạn có thể lấy

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());
})();
1từ bản phát hành Github mới nhất nếu 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 có 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.

28 hữu ích 2 bình luận chia sẻ 2 bình luận chia sẻ