Cách Mã Hóa Tệp Trước Khi Upload: AES-256 Ngay Trên Trình Duyệt
Mã hóa tệp tin phía client với AES-256-GCM qua Web Crypto API trước khi gửi lên đám mây. Bảo mật thông tin tuyệt đối không lưu lộ dữ liệu.
Khi xử lý các tài liệu cá nhân nhạy cảm, hồ sơ y tế hoặc mã nguồn độc quyền, mã hóa phía client zero-knowledge đảm bảo rằng tệp được mã hóa trong trình duyệt của người dùng trước khi truyền đi. Ngay cả khi cloud storage bị xâm phạm, dữ liệu được lưu trữ vẫn được mã hóa.
Thiết Lập Mật Mã: AES-256-GCM
Chúng ta sử dụng AES-GCM (Galois/Counter Mode) qua Web Crypto API gốc của trình duyệt:
- Cung cấp mã hóa đối xứng 256-bit.
- Dữ liệu xác thực tích hợp (kiểm tra tính toàn vẹn) ngăn chặn giả mạo.
- Yêu cầu một Initialization Vector (IV) duy nhất cho mỗi lần mã hóa.
Tải file text test chuẩn để kiểm thử các hàm mã hóa và giải mã AES-256 trên trình duyệt.
Tải File Mẫu 50KB TXT →Triển Khai Mã Hóa Phía Client Hoàn Chỉnh
export interface EncryptedPayload {
cipherBuffer: ArrayBuffer;
iv: Uint8Array;
}
// 1. Tạo Khóa Mã Hóa AES-256
export async function generateAesKey(): Promise<CryptoKey> {
return await crypto.subtle.generateKey(
{ name: 'AES-GCM', length: 256 },
true, // có thể trích xuất
['encrypt', 'decrypt']
);
}
// 2. Mã Hóa File ArrayBuffer
export async function encryptFile(file: File, key: CryptoKey): Promise<EncryptedPayload> {
const iv = crypto.getRandomValues(new Uint8Array(12)); // IV 96-bit được khuyến nghị cho AES-GCM
const plaintextBuffer = await file.arrayBuffer();
const cipherBuffer = await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
plaintextBuffer
);
return { cipherBuffer, iv };
}
// 3. Giải Mã CipherBuffer
export async function decryptFile(
cipherBuffer: ArrayBuffer,
key: CryptoKey,
iv: Uint8Array
): Promise<ArrayBuffer> {
return await crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
cipherBuffer
);
}
Các Lưu Ý Về Quản Lý Khóa
- Dẫn xuất mật khẩu: Không bao giờ dùng trực tiếp mật khẩu thô của người dùng làm khóa. Dẫn xuất khóa AES bằng PBKDF2 với ít nhất 600.000 vòng lặp và salt duy nhất.
- Lưu trữ IV: IV 12-byte không phải là bí mật. Nối IV vào trước ciphertext được mã hóa trước khi truyền đến máy chủ.
Nguyễn Đại Long
Tác GiảBackend Lead • Chuyên gia Kiến trúc Hệ thống Phân tán & Lưu trữ Đám mây
Hơn 4 năm kinh nghiệm thiết kế các hệ thống xử lý tệp tải lên thông lượng lớn, tối ưu hóa cơ sở dữ liệu và hạ tầng phân tán Cloudflare R2 / AWS S3. Người sáng lập FileDummy và Mạng lưới Hệ sinh thái NDL.
Bài viết này có hữu ích không?
Bấm Thích để ủng hộ tác giả và giúp bài viết lan tỏa tới cộng đồng lập trình viên.
Thảo Luận Kỹ Thuật & Đóng Góp Ý Kiến (0)
Chia sẻ kết quả benchmark, phản hồi các trường hợp biên hoặc đặt câu hỏi chuyên môn.
Chưa có bình luận nào. Hãy là lập trình viên đầu tiên bắt đầu cuộc thảo luận!
Câu Hỏi Thường Gặp (FAQ)
Why AES-256-GCM instead of AES-256-CBC?▾
AES-256-GCM provides both encryption and authenticated integrity verification in one operation — any tampering with the ciphertext is detected on decryption. AES-256-CBC only encrypts. GCM is the modern standard and is natively supported by the Web Crypto API.
Is client-side encryption safe from the server?▾
Client-side encryption with a user-held key achieves zero-knowledge — the server never sees plaintext. However, if the encryption code is served by the server, a compromised server could serve malicious JavaScript. True zero-knowledge requires code verification via subresource integrity or a native app.
What happens if I lose the encryption key?▾
The file is permanently unrecoverable. AES-256-GCM is computationally infeasible to break without the key. Always back up the key securely, derived from a password with PBKDF2 and salt.