Skip to content

Sang0603/Securechat

Repository files navigation

SecureChat - End-to-End Encryption Chat

Ứng dụng chat bảo mật với mã hóa end-to-end (E2EE) sử dụng Web Crypto API.

Kiến trúc

  • 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

Yêu cầu

  • Node.js (v18+)
  • MongoDB (local hoặc MongoDB Atlas)

Cài đặt

1. Cài đặt dependencies

npm install

2. Setup MongoDB

Option 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

3. Cấu hình .env

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):

  1. Vào MongoDB Atlas → Database Access (hoặc "Truy cập người dùng cơ sở dữ liệu")
  2. 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"
  3. Đổ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:

  1. Đăng nhập vào https://cloud.mongodb.com
  2. Chọn cluster của bạn
  3. Click nút "Connect"
  4. Chọn "Connect your application"
  5. Chọn driver: Node.js và version mới nhất
  6. Copy connection string (sẽ có dạng: mongodb+srv://<username>:<password>@cluster0.xxxxx.mongodb.net/)
  7. Thay <username><password> bằng username và password bạn vừa tạo/đặt
  8. 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

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.js

4. Chạy server

npm run dev

Server sẽ chạy tại http://localhost:3000

Sử dụng

  1. Mở browser và vào http://localhost:3000
  2. Nhập username (ví dụ: alice) và click "Connect"
  3. Để 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))
  4. Nhập tên người chat vào ô "chat with" và gửi tin nhắn

Tính năng

  • ✅ 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

Lưu ý

  • 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

Thành viên nhóm

  • Trần Thiện Sáng(trưởng nhóm)
  • Nguyễn Thị Hạnh An
  • Chu Tiến Dũng

Web đã được deploy: https://securechat-bjyn.onrender.com/

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors