Giao thức handshake
Trên trang này
Nalix triển khai giao thức handshake bảo mật cao, theo mô hình zero-trust, dựa trên X25519 (Curve25519) Elliptic Curve Diffie-Hellman (ECDH). Giao thức này đảm bảo mỗi session được mã hóa bằng một khóa phiên duy nhất, không bao giờ được truyền trên đường truyền.
Đường dẫn mã nguồn
src/Nalix.Codec/ProtocolFrames/Session/SessionInit.cssrc/Nalix.Codec/ProtocolFrames/Session/SessionChallenge.cssrc/Nalix.Codec/ProtocolFrames/Session/SessionProof.cssrc/Nalix.Codec/ProtocolFrames/Session/SessionEstablished.cssrc/Nalix.Codec/ProtocolFrames/Session/SessionTofu.cssrc/Nalix.Codec/Security/HandshakeX25519.cssrc/Nalix.Runtime/Handlers/HandshakeHandlers.cssrc/Nalix.SDK/Transport/Extensions/HandshakeExtensions.cs
Đảm bảo bảo mật
- Thỏa thuận chung: Cả client và server đều đóng góp vào khóa phiên cuối cùng.
- Perfect Forward Secrecy (PFS): Khóa tạm thời (ephemeral) được dùng cho mọi session.
- Xác minh danh tính: Trong production, cần ghim khóa công khai X25519 của server để chống tấn công man-in-the-middle (MitM) (hoặc dùng Trust-On-First-Use tường minh qua
SessionTofukhiTransportOptions.AllowTofu = truetrong môi trường phát triển). - Proof-of-Work thích ứng: Khi được bật, server có thể yêu cầu client giải một bài toán PoW trước khi handshake tiếp tục, nhằm làm chậm các đợt flood kết nối tự động. Xem Proof-of-Work.
- Toàn vẹn transcript: Mọi thông điệp handshake được băm vào một transcript để chống giả mạo hoặc tấn công phát lại.
Quy trình handshake
Sơ đồ dưới đây minh họa giao tiếp giữa Nalix SDK và các handler của Nalix Server.
sequenceDiagram
participant SDK as Client
participant Srv as Server
Note over SDK: Generate KeyPair & Nonce
SDK->>Srv: SessionInit<br/>[PublicKey, Nonce]
Note over Srv: Resolve Handlers<br/>Generate SrvKeyPair<br/>Compute MasterSecret
Srv->>SDK: SessionChallenge<br/>[PublicKey, Nonce, Proof]
Note over SDK: Verify Proof<br/>Compute Secrets<br/>Derive SessionKey
SDK->>Srv: SessionProof<br/>[Proof]
Note over Srv: Verify Proof<br/>Create Session<br/>Finalize Cipher
Srv->>SDK: SessionEstablished<br/>[Proof, SessionToken]
Note over SDK: Verify Proof<br/>Enable AEAD EncryptionCác giai đoạn giao thức
1. SessionInit
SDK khởi tạo bằng cách gửi khóa công khai tạm thời và một nonce ngẫu nhiên đủ mạnh về mặt mật mã qua khung SessionInit. Không có dữ liệu nhạy cảm nào được gửi ở bước này.
2. SessionChallenge
Server phản hồi bằng khóa công khai tạm thời của mình và một Proof qua khung SessionChallenge. Proof là một digest có khóa được tính trên transcript handshake bằng master secret đã dẫn xuất (qua HandshakeX25519.ComputeServerProof), chứng minh server sở hữu khóa riêng tương ứng mà không lộ khóa đó.
3. SessionProof
SDK kiểm tra proof của server. Nếu hợp lệ, nó tính ClientProof của riêng mình và gửi lại qua khung SessionProof. Bước này xác nhận với server rằng client đã dẫn xuất thành công cùng một bí mật chung.
4. SessionEstablished
Xác nhận cuối cùng. Server gửi khung SessionEstablished chứa SessionToken. SDK dùng token này để xác thực datagram UDP, và kết nối từ đây được mã hóa đầy đủ bằng khóa phiên đã dẫn xuất.
Chi tiết triển khai
- Mã hóa:
src/Nalix.Runtime/Handlers/HandshakeHandlers.csvàsrc/Nalix.SDK/Transport/Extensions/HandshakeExtensions.csđặt cipher đang hoạt động thànhCipherSuiteType.Chacha20Poly1305cho session đã thiết lập. - Token tiếp tục:
SessionEstablishedtrả vềSessionTokenhiện tại, sau đó SDK lưu vàoSessionState.SessionToken.