[Open-source] #6 - FileKey: Mã hóa tệp tin đỉnh cao với Passkey và kiến trúc Zero-Knowledge
Chào mọi người, tiếp tục hành trình khám phá thế giới mã nguồn mở, hôm nay chúng ta sẽ đến với một dự án cực kỳ đặc biệt trong lĩnh vực bảo mật: FileKey.
Nếu bạn đã quen với việc dùng Passkey để đăng nhập, thì FileKey sẽ cho bạn thấy một sức mạnh khác của nó: Dùng vân tay hoặc khuôn mặt để làm chìa khóa mã hóa dữ liệu. Đây là một ứng dụng "Serverless" đúng nghĩa, nơi quyền riêng tư được đẩy lên mức tuyệt đối.
Giới thiệu chung
FileKey không phải là một dịch vụ lưu trữ đám mây như Google Drive hay Dropbox. Nó là một công cụ mã hóa đầu cuối (E2EE) cực kỳ tinh gọn. Triết lý của dự án là "Không tin tưởng bất kỳ ai" (Zero-trust). Mọi quá trình mã hóa, giải mã đều diễn ra ngay trên trình duyệt của bạn, không có dữ liệu nào được gửi về server.
Github: https://github.com/RockwellShah/filekey
Ngôn ngữ chủ đạo: JavaScript (Vanilla JS - Không framework để đảm bảo minh bạch).
Kiến trúc: Client-side Only, PWA (Offline-first).
🏗️ Những điểm sáng về kiến trúc và kỹ thuật
1. Phép màu từ WebAuthn PRF (Pseudo-Random Function)
Đây chính là "vũ khí hạng nặng" của FileKey. Thông thường, Passkey chỉ dùng để xác thực. Nhưng với tiện ích mở rộng PRF, FileKey có thể yêu cầu Passkey (Yubikey, Windows Hello, FaceID...) cung cấp một giá trị ngẫu nhiên xác định (deterministic).
- Giá trị này là duy nhất cho mỗi thiết bị và mỗi trang web.
- Nó đóng vai trò là "Seed" (hạt giống) để tạo ra khóa mã hóa mà không cần bạn phải nhớ mật khẩu dài dằng dặc.
2. Kiến trúc Zero-Knowledge & Serverless
FileKey hoàn toàn không có backend xử lý dữ liệu.
- Không tài khoản: Bạn không cần đăng ký. Passkey chính là danh tính của bạn.
- Mã hóa cấp thấp: Sử dụng Web Cryptography API (SubtleCrypto) trực tiếp từ trình duyệt để thực hiện AES-GCM 256-bit, đảm bảo tốc độ cực nhanh và an toàn cấp độ quân đội.
3. Chia sẻ tệp không cần mật khẩu (ECDH)
Làm sao để gửi tệp mã hóa cho người khác mà không cần nhắn tin mật khẩu? FileKey sử dụng giao thức ECDH (Elliptic Curve Diffie-Hellman) trên đường cong P-521.
- Người nhận gửi "Share Key" (Public Key).
- Người gửi dùng nó để tạo ra một "Bí mật chung" (Shared Secret) để mã hóa tệp.
- Chỉ người nhận với đúng Passkey của họ mới có thể mở được tệp đó.
🔄 Luồng hoạt động (Workflow Diagram)
Dưới đây là sơ đồ luồng dữ liệu khi bạn thực hiện mã hóa một tệp tin cá nhân:

A. Giai đoạn tạo "Hạt giống" (Secret Seeding)
Điểm khác biệt của FileKey là không dùng mật khẩu do người dùng nhập (vốn dễ bị tấn công brute-force hoặc keylogger).
- WebAuthn PRF Extension: Khi bạn chạm tay vào cảm biến, trình duyệt gửi một giá trị "Salt" tới thiết bị bảo mật. Thiết bị sẽ dùng một khóa nội bộ (không bao giờ rời khỏi phần cứng) để băm (hash) cái Salt đó và trả về một chuỗi nhị phân ngẫu nhiên.
- Tính xác định (Determinism): Với cùng một thiết bị và cùng một Salt, kết quả trả về luôn luôn giống nhau. Đây là lý do tại sao bạn không cần lưu trữ khóa mã hóa mà vẫn có thể giải mã được tệp sau này.
B. Hàm dẫn xuất khóa HKDF (Key Derivation Function)
Giá trị nhận được từ Passkey chưa thể dùng làm khóa mã hóa ngay. FileKey sử dụng HKDF (RFC 5869):
- Extract: Nó "nén" độ hỗn loạn từ Passkey để tạo ra một khóa gốc ổn định.
- Expand: Nó mở rộng khóa gốc đó thành một khóa AES-256 chuẩn.
- Tại sao cần Salt? Salt giúp đảm bảo rằng ngay cả khi hai tệp tin giống hệt nhau được mã hóa bởi cùng một người, khóa cuối cùng vẫn sẽ khác nhau, ngăn chặn các cuộc tấn công phân tích tần suất.
C. Mã hóa xác thực với AES-GCM (Authenticated Encryption)
FileKey sử dụng thuật toán AES-256-GCM. Đây là lựa chọn "vàng" vì:
- Confidentiality: Mã hóa nội dung tệp tin.
- Integrity (Tính toàn vẹn): GCM tạo ra một Authentication Tag. Nếu kẻ tấn công thay đổi dù chỉ 1 bit trong tệp tin đã mã hóa, quá trình giải mã sẽ báo lỗi ngay lập tức thay vì trả về dữ liệu rác. Điều này chống lại các cuộc tấn công thay đổi nội dung tệp (Bit-flipping attacks).
D. Quản lý bộ nhớ (Memory Safety)
Một điểm cực kỳ quan trọng trong kiến trúc của FileKey là Zero-persistence:
- In-Memory Only: Khóa AES và dữ liệu chưa mã hóa chỉ tồn tại trong RAM của trình duyệt dưới dạng
ArrayBuffer. - Garbage Collection: Ngay sau khi tệp
.filekeyđược tạo ra và tải xuống, các biến chứa khóa sẽ được gán bằngnullhoặc ghi đè, chờ trình dọn rác (Garbage Collector) xóa sạch. Không có dữ liệu nhạy cảm nào được ghi xuống bộ nhớ đệm (Cache) của ổ cứng.
E. Cấu trúc tệp tin .filekey
Khi bạn mở tệp .filekey bằng các trình soạn thảo Hex, bạn sẽ thấy nó được cấu tạo gồm:
- Header: Chứa thông tin phiên bản.
- Salt (16 bytes): Dùng để tái tạo lại khóa từ Passkey.
- IV (12 bytes): Vector khởi tạo cho thuật toán AES.
- Auth Tag (16 bytes): Dùng để kiểm tra tính toàn vẹn.
- Encrypted Data: Toàn bộ nội dung tệp đã được "xào nấu".
💻 Khả năng tương thích (Compatibility)
Vì sử dụng các công nghệ web mới nhất, FileKey yêu cầu trình duyệt và phần cứng hỗ trợ WebAuthn PRF:
| Nền tảng | Trình duyệt hỗ trợ | Ghi chú |
|---|---|---|
| macOS | Safari ≥ 17, Chrome ≥ 112 | Hỗ trợ Apple Passwords, Yubikey. |
| Windows | Edge ≥ 112, Chrome ≥ 112 | Yêu cầu Windows 11 và Windows Hello. |
| Android | Chrome ≥ 112 | Hỗ trợ Google Passwords, Yubikey. |
| iOS | Safari ≥ 17 | Hỗ trợ FaceID/TouchID. |
✅ Kết luận: Tại sao nên chọn FileKey?
- Quyền riêng tư tuyệt đối: Phù hợp để mã hóa các tài liệu cực kỳ nhạy cảm (mật khẩu dự phòng, giấy tờ cá nhân) trước khi tải lên mây.
- Hoạt động ngoại tuyến: Nhờ Service Worker (PWA), bạn có thể ngắt mạng hoàn toàn và vẫn thực hiện mã hóa/giải mã bình thường.
- Không phụ thuộc: Bạn không cần tin tưởng vào một công ty nào cả, chỉ cần tin vào toán học và thiết bị bảo mật của chính mình.
Đây là một minh chứng tuyệt vời cho việc kết hợp các tiêu chuẩn Web hiện đại để tạo ra một công cụ bảo mật mạnh mẽ nhưng cực kỳ dễ dùng.
Hy vọng bài viết này giúp bạn hiểu thêm về một cách tiếp cận bảo mật dữ liệu hoàn toàn mới. Đừng quên Upvote và Follow mình để chờ đợi "siêu phẩm" tiếp theo nhé!
All rights reserved