Ứng dụng chat bảo mật với mã hóa end-to-end (E2EE) sử dụng Web Crypto API.
- Client: Tạo key ECDH, bắt tay, derive AES-GCM key, encrypt/decrypt bằng Web Crypto API
- Server: Chỉ forward message và lưu ciphertext vào MongoDB
- MongoDB: Không biết plaintext, chỉ lưu ciphertext, IV, và metadata
- Node.js (v18+)
- MongoDB (local hoặc MongoDB Atlas)
npm installOption B: MongoDB Atlas
- Tạo account tại https://www.mongodb.com/cloud/atlas
- Tạo cluster và database
- Vào "Connect" → "Connect your application"
- Copy connection string (format:
mongodb+srv://username:password@cluster.mongodb.net/) - Thêm database name và options:
mongodb+srv://username:password@cluster.mongodb.net/securechat?retryWrites=true&w=majority
Tạo file .env trong thư mục gốc với nội dung:
Cho MongoDB Atlas:
MONGODB_URI=mongodb+srv://securechat:123456ASZ@cluster.mongodb.net/securechat?retryWrites=true&w=majority
PORT=3000
Cách tạo/đổi Database User (username & password):
- Vào MongoDB Atlas → Database Access (hoặc "Truy cập người dùng cơ sở dữ liệu")
- Tạo user mới:
- Click "Add New Database User" (hoặc "Thêm người dùng cơ sở dữ liệu mới")
- Chọn "Password" làm authentication method
- Nhập Username (ví dụ:
securechat) - Nhập Password (hoặc click "Autogenerate Secure Password" để tự tạo)
- Lưu password lại (sẽ không xem được sau này!)
- Chọn quyền: "Atlas admin" hoặc "Read and write to any database"
- Click "Add User"
- Đổi password user hiện tại:
- Tìm user trong danh sách
- Click "Edit" (biểu tượng bút chì)
- Click "Edit Password"
- Nhập password mới
- Click "Update User"
Cách lấy connection string đúng từ MongoDB Atlas:
- Đăng nhập vào https://cloud.mongodb.com
- Chọn cluster của bạn
- Click nút "Connect"
- Chọn "Connect your application"
- Chọn driver: Node.js và version mới nhất
- Copy connection string (sẽ có dạng:
mongodb+srv://<username>:<password>@cluster0.xxxxx.mongodb.net/) - Thay
<username>và<password>bằng username và password bạn vừa tạo/đặt - Thêm database name và options:
/securechat?retryWrites=true&w=majority- Ví dụ:
mongodb+srv://securechat:yourpassword@cluster0.38fjnrg.mongodb.net/securechat?retryWrites=true&w=majority
- Ví dụ:
Nếu gặp lỗi querySrv ENOTFOUND:
- Kiểm tra lại connection string có đúng không (copy lại từ Atlas)
- Đảm bảo cluster đang hoạt động (không bị pause)
- Kiểm tra Network Access: IP của bạn phải được whitelist (hoặc cho phép từ mọi nơi
0.0.0.0/0) - Kiểm tra Database Access: user phải có quyền read/write
Test connection:
node test-mongo-connection.jsnpm run devServer sẽ chạy tại http://localhost:3000
- Mở browser và vào
http://localhost:3000 - Nhập username (ví dụ:
alice) và click "Connect" - Để chat với người khác:
- Mở tab mới với username khác (ví dụ:
bob) - Ở mỗi tab, click "Copy/share my pubkey" để lấy public key
- Copy public key của tab này và paste vào localStorage của tab kia:
localStorage.setItem("pubkey_of_bob", '{"kty":"EC",...}');
- Hoặc dùng console để set:
localStorage.setItem("pubkey_of_bob", JSON.stringify(pubkeyObject))
- Mở tab mới với username khác (ví dụ:
- Nhập tên người chat vào ô "chat with" và gửi tin nhắn
- ✅ End-to-end encryption với ECDH + AES-GCM
- ✅ Server không biết plaintext
- ✅ Lưu lịch sử chat vào MongoDB (ciphertext)
- ✅ Load lại lịch sử và decrypt ở client
- ✅ WebSocket real-time messaging
- Demo này dùng localStorage để share public key giữa các tab (để test nhanh)
- Trong production, cần có key exchange protocol hoặc key directory service
- Public key fingerprint được hiển thị để verify anti-MITM
- Trần Thiện Sáng(trưởng nhóm)
- Nguyễn Thị Hạnh An
- Chu Tiến Dũng