Hướng dẫn toàn diện về Thư viện mã hóa Crypto-JS cho JavaScript

Crypto-JS là một thư viện mã hóa mã nguồn mở, cung cấp các thuật toán bảo mật tiêu chuẩn được triển khai thuần JavaScript — hoạt động cả trong môi trường trình duyệt lẫn Node.js. Với giao diện đơn giản và hỗ trợ đa dạng thuật toán, thư viện này giúp tích hợp nhanh chóng các chức năng như mã hóa đối xứng, băm dữ liệu, và ký thông điệp mà không cần依賴 vào hệ thống nền tảng.

Cài đặt và sử dụng cơ bản

Trong dự án Node.js, bạn có thể thêm Crypto-JS qua npm:

npm install crypto-js

Ở phía client, thư viện cũng tương thích với cách tải trực tiếp qua CDN hoặc import tĩnh:

<script src="https://cdn.jsdelivr.net/npm/crypto-js@4.2.0/crypto-js.min.js"></script>

Mã hóa AES với khóa tùy chỉnh

Dưới đây là ví dụ minh họa việc mã hóa và giải mã một chuỗi văn bản bằng thuật toán AES-128-CBC, sử dụng khóa bí mật và vector khởi tạo (IV) rõ ràng để tăng tính kiểm soát:

const CryptoJS = require('crypto-js');

// Khởi tạo IV ngẫu nhiên 16 byte
const iv = CryptoJS.enc.Utf8.parse('1234567890123456');
const secretKey = 'my-super-secret-key';

// Mã hóa
const plaintext = 'Dữ liệu nhạy cảm cần bảo vệ';
const encrypted = CryptoJS.AES.encrypt(plaintext, secretKey, {
  iv: iv,
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.Pkcs7
});
const cipherHex = encrypted.toString();

// Giải mã
const decrypted = CryptoJS.AES.decrypt(cipherHex, secretKey, {
  iv: iv,
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.Pkcs7
});
const result = decrypted.toString(CryptoJS.enc.Utf8);

console.log(result); // 'Dữ liệu nhạy cảm cần bảo vệ'

Các thành phần chính

Thư viện được tổ chức theo mô-đun chức năng, cho phép import từng phần thay vì tải toàn bộ:

  • Băm dữ liệu: MD5, SHA-1, SHA-256, SHA-512, RIPEMD-160
  • Mã hóa khối: AES, TripleDES, Rabbit, RC4
  • Công cụ mã hóa: Base64, UTF8, Hex, Latin1
  • Mã xác thực: HmacMD5, HmacSHA1, HmacSHA256, HmacSHA512

Xử lý cấu trúc dữ liệu phức tạp

Khi làm việc với mảng hoặc đối tượng, cần tuần tự hóa trước khi mã hóa và phân tích lại sau khi giải mã:

const payload = { userId: 42, role: 'admin', timestamp: Date.now() };

// Mã hóa toàn bộ đối tượng
const encodedPayload = JSON.stringify(payload);
const secured = CryptoJS.AES.encrypt(encodedPayload, 'key-2024').toString();

// Giải mã và tái tạo đối tượng
const decoded = CryptoJS.AES.decrypt(secured, 'key-2024').toString(CryptoJS.enc.Utf8);
const restored = JSON.parse(decoded);

console.log(restored.userId); // 42

Tài nguyên tham khảo

Phiên bản hiện tại của Crypto-JS (v4.x) duy trì tính ổn định cao nhưng không còn nhận cập nhật tính năng mới. Tài liệu đầy đủ được lưu trữ tại:

Lưu ý quan trọng về bảo mật

Crypto-JS không sinh khóa ngẫu nhiên an toàn trên trình duyệt (do thiếu entropy), nên không phù hợp cho việc sinh khóa mật mã mạnh. Các tác vụ như tạo khóa AES hoặc nonce nên dùng API gốc crypto.subtle (trình duyệt) hoặc crypto.randomBytes() (Node.js). Ngoài ra, việc truyền khóa bí mật dưới dạng chuỗi tĩnh trong mã nguồn là rủi ro bảo mật nghiêm trọng — cần kết hợp với cơ chế quản lý khóa chuyên biệt (ví dụ: KMS, environment variables, hoặc secure vault).

Thẻ: crypto-js aes sha256 hmac base64

Đăng vào ngày 28 tháng 5 lúc 11:03