Thiết kế bảo mật
Khóa trên điện thoại,
mở trên điện thoại.
Bài viết, ảnh và cuộc trò chuyện được niêm phong trước khi rời điện thoại, và chỉ những người bạn chọn mới mở được. Việc bạn quen biết ai do điện thoại của mỗi người giữ, máy chủ không lưu.
01 Niêm phong
Chỉ những người bạn chọn
mới mở được
Khi bạn đăng bài, điện thoại niêm phong bài viết trước rồi mới gửi đi. Máy chủ chỉ giữ và chuyển bài viết đã niêm phong, không có khóa để mở. Câu trả lời, ảnh, video và bản xem trước liên kết cũng đi theo cùng một đường.
Bên trong lõi bảo mật, điện thoại của người viết tạo một khóa nội dung mới chỉ dành cho bài viết này.
Khóa đó được dùng để khóa chữ, ảnh và video. Phần chữ được độn thêm đến một kích thước cố định rồi mới khóa, để không lộ độ dài chính xác.
Với mỗi người nhận, khóa nội dung được niêm phong bằng khóa mã hóa của người đó, tạo ra từng phong bì một. Người viết cũng có một phong bì của riêng mình.
Máy chủ nhận bản mã và phong bì, giữ lại rồi chuyển cho người nhận. Khóa mở phong bì chỉ có trên điện thoại của người nhận, nên máy chủ không mở được.
Bên trong lõi bảo mật, điện thoại của người nhận mở phong bì của mình và lấy ra khóa nội dung.
Khóa đó mở bài viết và hiện lên màn hình.
- Máy chủ chỉ có bản mã
- Bài viết, câu trả lời, ảnh, video và bản xem trước liên kết đều đã được khóa trước khi đến máy chủ.
- Mỗi người đọc một phong bì
- Khóa của một bài viết được cho vào phong bì riêng cho từng người đọc, và chỉ điện thoại của người đó mở được phong bì ấy.
- Mỗi bài viết một khóa mới
- Mỗi bài viết và mỗi câu trả lời đều có khóa mới riêng. Khóa của bài này không mở được bài khác.
- Điện thoại của bạn quyết định ai nhận
- Điện thoại của bạn niêm phong bài viết cho danh sách Fam mà chính nó giữ. Chỉ những người đã chấp nhận lời đề nghị, hoặc kết Fam qua mã QR hay liên kết Fam, mới vào được danh sách đó. Liên kết Fam bạn gửi chỉ dùng được một lần trong 24 giờ, và người mở đầu tiên sẽ thành Fam mà không cần bạn xác nhận — gửi liên kết chính là đồng ý.
Bài viết được khóa bằng XChaCha20-Poly1305. Phong bì được niêm phong bằng X25519 rồi đặt trong bí mật chung của cặp, bí mật này được chia sẻ đồng thời bằng X25519 và ML-KEM-768.
02 Mối quan hệ
Việc bạn quen biết ai
chỉ nằm trên điện thoại
Danh sách Fam của bạn được niêm phong trên điện thoại, và máy chủ không lưu ai đã đưa ai vào, cũng không lưu ai đã gửi gì cho ai. Những gì được niêm phong đi qua các hộp thư không gắn với tài khoản nào. Tuy vậy, ngay lúc yêu cầu đến, máy chủ vẫn thấy địa chỉ IP và thời điểm, và nhờ đó hộp thư có thể bị nối với tài khoản. Với những người do đội Krypton trực tiếp đưa vào, máy chủ lưu lại việc đội đã đưa họ vào.
- Bí mật chỉ hai điện thoại biết
- Khi hai người kết Fam, hai điện thoại chia sẻ một bí mật mà máy chủ không thấy được. Mọi thứ đi lại giữa hai người đều tìm đường nhờ bí mật này.
- Hộp thư, không phải tài khoản
- Bài viết, cuộc trò chuyện và danh thiếp được đưa vào các hộp thư không gắn với tài khoản nào, và số hộp thư thay đổi sau mỗi 30 ngày.
- Người gửi nằm trong niêm phong
- Ai là người gửi được niêm phong bên trong cùng với chữ ký, và điện thoại nhận sẽ kiểm tra chữ ký đó.
- Lời mời không nằm trong hồ sơ
- Thành viên nhận những vé mời mà máy chủ phát ra mà không nhìn thấy nội dung. Khi có người vào, máy chủ chỉ kiểm tra vé đó có thật hay không. Hồ sơ máy chủ lưu không có việc ai đã đưa ai vào, nhưng nhật ký kết nối và yêu cầu ngay lúc đó có thể cho thấy điều này.
Bí mật chung của hai người được niêm phong đồng thời bằng X25519 và ML-KEM-768, khóa hộp thư được tạo bằng HKDF-SHA256, và người gửi ký bằng Ed25519.
03 Khóa
Khóa nằm
trong điện thoại của bạn
Khóa riêng của bạn nằm trong lõi bảo mật trên điện thoại, là lõi chung của ứng dụng iPhone và Android. Ngay cả mã ứng dụng vẽ màn hình cũng không nhận được khóa.
- Thẻ số (handle)
- Bài viết và ảnh đã mở
Khóa riêng không bao giờ đi qua
- Bốn khóa riêng
- Khóa nội dung
- Khóa riêng đã khóa
- Chỉ trên điện thoại này
- Khóa công khai
- Bản sao lưu khôi phục đã khóa
- Nửa khôi phục · mã băm để tìm
- Chỉ trên điện thoại này
- Được giữ trong Keychain của iPhone hoặc Keystore của Android, và không bao giờ theo bản sao lưu sang điện thoại khác. Điện thoại mới chỉ nhận lại khóa qua việc khôi phục.
- Mã ứng dụng chỉ thấy thẻ số
- Lõi đưa cho ứng dụng một thẻ số thay vì khóa. Chỉ với thẻ số thì bên ngoài ứng dụng không mở được gì.
- Không số điện thoại, không email
- Để đăng ký và đăng nhập, bạn chỉ dùng khóa trên điện thoại. Chúng tôi không thu số điện thoại hay địa chỉ email.
- Tiêu chuẩn mã hóa phổ biến
- Chúng tôi không dùng mật mã tự chế. Các tiêu chuẩn phổ biến được dùng qua phần triển khai của các thư viện Rust dalek và RustCrypto.
- X25519
- ML-KEM-768
- Ed25519
- XChaCha20-Poly1305
- HKDF-SHA256
- BIP39
04 Khôi phục
Mất điện thoại,
tài khoản vẫn còn
Hãy đặt mã PIN và chép 18 từ tiếng Anh ra giấy — bạn nhận các từ khi tham gia, hoặc tạo sau trong Cài đặt. Trên điện thoại mới, khi các từ và mã PIN khớp, tài khoản sẽ trở lại.
- Các từ chỉ có trên giấy
- 18 từ chỉ hiện một lần khi bạn tạo, và bạn được hỏi lại vài từ để xác nhận đã chép đúng. Bạn có thể tạo khi tham gia hoặc sau đó trong Cài đặt. Các từ không được lưu trên máy chủ, trên đám mây hay trên điện thoại, và sẽ không hiện lại lần nữa.
- Cần cả các từ lẫn mã PIN
- Chỉ có các từ hoặc chỉ có mã PIN đều không mở được. Mã PIN sẽ bị khóa sau vài lần nhập sai, và máy chủ tìm tài khoản bằng mã băm của một giá trị một chiều tạo từ các từ, không bao giờ bằng chính các từ.
- Thời gian để dừng lại
- Việc khôi phục chỉ hoàn tất sau 48 giờ chờ. Trong thời gian đó, điện thoại cũ thấy yêu cầu và có thể hủy.
- Chỉ với những gì máy chủ giữ thì không mở được
- Bí mật mở bản sao lưu gồm hai nửa: một nửa trên máy chủ, nửa kia nằm trong các từ bạn chép trên giấy. Kể cả khi lấy được toàn bộ máy chủ, không có các từ thì vẫn không mở được.
Các từ là 18 từ theo tiêu chuẩn BIP39, tương đương 192 bit. Kể cả máy tính lượng tử cũng cần 2⁹⁶ lần đoán. Hai nửa được ghép bằng HKDF để mở bản sao lưu.
05 Gọi điện
Cuộc gọi chỉ ở lại
giữa hai người
Trò chuyện bằng giọng nói với Fam. Giọng nói được mã hóa giữa hai điện thoại, và lịch sử cuộc gọi chỉ nằm trên điện thoại của mỗi người.
- Chỉ Fam mới gọi được
- Chuông gọi được niêm phong và đổ qua hộp thư chỉ hai người dùng chung. Máy chủ không ghi lại ai gọi cho ai.
- Chỉ máy nhận biết ai đang gọi
- Điện thoại nhận tự mở niêm phong để biết ai đang gọi và hiện lên màn hình cuộc gọi đến. Máy chủ không biết tên người gọi.
- Máy chủ chuyển tiếp che địa chỉ IP
- Cuộc gọi thường được nối qua máy chủ chuyển tiếp. Máy chủ chuyển tiếp thấy địa chỉ IP của hai điện thoại nhưng không mở được âm thanh đã mã hóa, và người bên kia không thấy địa chỉ IP của bạn. Nếu điện thoại không nhận được thông tin chuyển tiếp, hai điện thoại sẽ nối trực tiếp, và khi đó hai bên có thể thấy địa chỉ IP của nhau.
- Kết nối có chữ ký của cả hai điện thoại
- Mỗi điện thoại ký thông tin kết nối bằng khóa riêng của mình. Nếu có gì bị tráo ở giữa đường, cuộc gọi sẽ không kết nối được.
Thông tin kết nối được ký bằng khóa tài khoản Ed25519 của mỗi người.
06 Bạn tự quyết định
Bạn quyết định
điều gì được thấy
Khóa ứng dụng, chọn ai được xem danh thiếp, và những gì hiện trên màn hình thì chỉ ở lại trên màn hình.
- Khóa ứng dụng
- Khóa Krypton bằng nhận diện khuôn mặt, vân tay hoặc mật mã của điện thoại — ngay lập tức, hoặc sau khi rời ứng dụng 1 phút, 15 phút hay 1 giờ. Khi bật, màn hình chuyển ứng dụng cũng không hiện nội dung. Cài đặt này chỉ nằm trên điện thoại, và máy chủ không biết bạn có dùng khóa hay không.
- Ai được xem danh thiếp
- Danh thiếp được niêm phong. Bạn chọn Chỉ Fam hoặc Mọi người, và dù chọn bên nào, ảnh gốc chỉ đến với Fam. Khi bạn thu hẹp phạm vi, điện thoại sẽ niêm phong lại danh thiếp bằng khóa mới.
- Chặn chụp màn hình
- Màn hình bạn xem trong Krypton không chụp và cũng không quay lại được.
- Bài viết biến mất
- Khi bạn đăng dưới dạng bài viết biến mất, 24 giờ sau khi xuất hiện, bài viết, cuộc trò chuyện và ảnh sẽ cùng biến mất.
07 Kháng lượng tử
Khó phá,
kể cả với máy tính lượng tử
Có kiểu tấn công thu thập bản mã ngay hôm nay để sau này mở bằng máy tính lượng tử. Ở lớp ngoài trao khóa cho những người bạn chọn, Krypton dùng đồng thời mã hóa đã được kiểm chứng hiện nay (X25519) và mã hóa kháng lượng tử (ML-KEM-768).
- Phải phá được cả hai mới mở được
- Bí mật từ hai loại mã hóa được gộp làm một rồi mới niêm phong. Nếu một bên lộ điểm yếu, bên kia vẫn giữ vững. Đây là cách kết hợp giống như Signal và iMessage đã chọn.
- Mọi lớp ngoài đều dùng cả hai
- Lời đề nghị kết Fam và tin nhắn để mỗi cặp chia sẻ bí mật chung, bản sao lưu đã niêm phong, khôi phục, gói lời mời và báo cáo — mọi lớp ngoài trao khóa đều được niêm phong bằng cả hai loại mã hóa. Bài viết và cuộc trò chuyện trong hộp thư của mỗi cặp được bọc bằng bí mật 256 bit của cặp đó, chia sẻ theo cách này.
- Khóa công khai không thể bị tráo
- Khóa công khai kháng lượng tử cũng được gắn với chữ ký tài khoản. Nếu máy chủ hay bất kỳ ai ở giữa tráo sang khóa khác, chữ ký sẽ không khớp và điện thoại sẽ từ chối.
- Phần khóa nội dung vẫn vững chắc
- XChaCha20-Poly1305 256 bit dùng để khóa bài viết và ảnh, cùng với SHA-256, vẫn còn đủ độ mạnh trước máy tính lượng tử nên không cần thay đổi.
Lớp ngoài được niêm phong đồng thời bằng X25519 và ML-KEM-768 (tiêu chuẩn NIST của Mỹ, FIPS 203), và hai bí mật được gộp làm một bằng SHA3-256.
Những phần vẫn đang chuyển đổi
- Chữ ký (Ed25519) hiện chưa kháng lượng tử. Dù chữ ký bị giả mạo, nội dung cũ cũng không bị mở. Mỗi tài khoản đã có khóa ký ML-DSA (FIPS 204), được tạo ngay khi bạn tham gia và gắn với danh tính của bạn, và chúng tôi dự định bật chữ ký dùng nó cùng với Ed25519 trước khi máy tính lượng tử thực dụng có vẻ sắp xuất hiện.
- Lời mời ẩn danh vẫn tiếp tục che giấu lời mời đó là của ai, kể cả trước máy tính lượng tử. Phần ngăn lời mời bị giả mạo sẽ được chuyển đổi cùng với chữ ký.
- Âm thanh cuộc gọi được khóa giữa hai điện thoại bằng mã hóa theo tiêu chuẩn WebRTC, và phần này hiện chưa kháng lượng tử.
Những điều không ứng dụng nào bảo vệ được
- Ảnh mà người nhận lưu vào thư viện ảnh của họ, hoặc màn hình bị chụp bằng một máy ảnh khác
- Người được bạn đưa điện thoại khi chưa khóa
- Người dùng ứng dụng đã bị sửa để lấy ra những gì họ đã nhận
- Bản ghi âm mà người bên kia tự thực hiện trong cuộc gọi
- Điện thoại đã bị mã độc chiếm quyền
- Người theo dõi mạng dùng địa chỉ IP và thời điểm để nối hộp thư, cuộc gọi hay việc đăng ký với một tài khoản — Krypton không gửi yêu cầu qua máy chủ chuyển tiếp che địa chỉ IP
- Ứng dụng bị sửa đổi bỏ qua các quy tắc giữ trên điện thoại — những quy tắc như chặn hay giới hạn số lần trao bài viết do ứng dụng của người nhận giữ, máy chủ không chặn
- Bí mật giữa bạn và một người Fam bị lộ — bí mật này không đổi theo thời gian, nên các tin nhắn đã niêm phong của cặp đó còn trên máy chủ (tối đa 90 ngày) có thể bị mở
Bản mô tả kỹ thuật đầy đủ sẽ được công bố trên GitHub.