Mã hoá
Ghi chú được mã hoá trong trình duyệt trước khi gửi đi. Cloudflare lưu ciphertext và khoá đã bọc, và không đọc được cả hai.
Một khoá dữ liệu, được bảo vệ hai lần
Phần tiêu đề “Một khoá dữ liệu, được bảo vệ hai lần”Passphrasechỉ có trong đầu bạn
Argon2id
64 MiB, t=3
64 MiB, t=3
KEKkhoá mã hoá khoá
AES-GCM wrap
wrappedDeklưu trong D1
Mã khôi phụcghi ra giấy, cất riêng
HKDF-SHA256
RKEKkhoá khôi phục
AES-GCM wrap
recoveryDeklưu trong D1
Khoá dữ liệu (DEK)ngẫu nhiên 256-bit, chỉ trong bộ nhớ
AES-256-GCM
AAD = note:<id>
AAD = note:<id>
Ciphertext của ghi chútiêu đề, nội dung, nhãn và màu, lưu trong D1
Màu cam: bí mật không bao giờ rời trình duyệt. Viền đứt: thứ máy chủ lưu.
- Một khoá dữ liệu (DEK) ngẫu nhiên 256-bit mã hoá mọi ghi chú.
- Passphrase của bạn được Argon2id kéo giãn thành một khoá dùng để bọc khoá dữ liệu.
- Mã khôi phục được chuyển thành khoá thứ hai, bọc cùng khoá dữ liệu đó.
Bí mật nào trong hai cũng mở được khoá dữ liệu. Vì vậy mã khôi phục cứu được ghi chú, và đổi passphrase không cần mã hoá lại gì cả.
Máy chủ thấy và không thấy gì
Phần tiêu đề “Máy chủ thấy và không thấy gì”| Được mã hoá (nằm trong ciphertext) | Dạng rõ (để sắp xếp ghi chú) |
|---|---|
| Tiêu đề | pinned |
| Nội dung | archived |
| Nhãn | trashed_at |
| Màu | position và thời gian |
Các lớp bảo vệ
Phần tiêu đề “Các lớp bảo vệ”- Passphrase, khoá dữ liệu và nội dung ghi chú không bao giờ rời trình duyệt ở dạng rõ.
- Trong một phiên, khoá dữ liệu là
CryptoKeykhông trích xuất được, chỉ nằm trong bộ nhớ. Khoá app là xoá nó. - Bản offline trên máy chứa đúng ciphertext và khoá đã bọc như trên máy chủ. Đăng xuất sẽ xoá nó.
- Ciphertext của mỗi ghi chú gắn với id của nó, nên máy chủ không thể tráo nội dung giữa các ghi chú.
- Client từ chối tham số Argon2 thấp hơn ngưỡng an toàn, nên máy chủ độc hại không thể hạ cấp việc tạo khoá.
- Worker tự kiểm tra JWT của Cloudflare Access (chữ ký, issuer, audience) thay vì tin vào header.
- App đi kèm Content Security Policy chặt. Trình hiển thị Markdown escape HTML thô và loại bỏ URL thực thi được.
Thuật toán
Phần tiêu đề “Thuật toán”| Bước | Thuật toán |
|---|---|
| Passphrase → khoá mã hoá khoá | Argon2id (64 MiB, t=3, p=1) |
| Mã khôi phục → khoá khôi phục | HKDF-SHA256 |
| Bọc khoá dữ liệu | AES-256-GCM |
| Mỗi ghi chú | AES-256-GCM với IV ngẫu nhiên 96-bit và AAD note:<id> |