Mật khẩu không phải là khoá
Mật khẩu người dùng đặt thường ngắn và dễ đoán. Thuật toán mã hoá cần khoá ngẫu nhiên đủ dài. PBKDF2 nối hai thứ đó: nó băm mật khẩu cùng một chuỗi muối ngẫu nhiên lặp đi lặp lại nhiều lần, cho ra khoá 256 bit. Mỗi lần đoán thử mật khẩu, kẻ tấn công cũng phải lặp đủ chừng ấy vòng.
const base = await crypto.subtle.importKey('raw', enc.encode(pass), 'PBKDF2', false, ['deriveKey']);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', hash: 'SHA-256', salt, iterations: 600000 },
base, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);AES-GCM: khoá kèm con dấu
AES-GCM vừa giấu nội dung vừa gắn một thẻ xác thực. Sửa dù một bit trong bản mã, lúc giải mã thẻ sẽ không khớp và trình duyệt từ chối trả kết quả. Không có chuyện giải ra một nội dung sai mà không ai biết.
const iv = crypto.getRandomValues(new Uint8Array(12));
const ct = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, enc.encode(text));
// lưu: muối (16 byte) + iv (12 byte) + bản mãNhững gì trình duyệt làm hộ
- Web Crypto chạy bằng mã gốc của trình duyệt, nhanh và đã được kiểm định
- Khoá tạo ra có thể đánh dấu không xuất được, mã JavaScript cũng không đọc ra được
- Chỉ chạy trên HTTPS, tránh bị chèn mã khi truyền
Dùng vào đâu
Hồ sơ cá nhân, dữ liệu học sinh, tài liệu nội bộ có thể được khoá ngay tại máy người nhập trước khi lưu lên máy chủ. Đổi lại, quên mật khẩu là mất dữ liệu: thiết kế quy trình khôi phục là một phần của bài toán, không phải chuyện để sau.