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).