# 🔐 Hướng dẫn Bảo mật & Mã hóa trong SonChat

Tài liệu này giải thích chi tiết các công nghệ mã hóa được sử dụng trong SonChat, cách chúng hoạt động và vai trò của chúng trong việc bảo vệ dữ liệu của bạn.

---

## 1. Mã hóa Đối xứng (Symmetric Encryption) — AES-256-GCM

### 🧊 Khái niệm
Mã hóa đối xứng sử dụng **cùng một chiếc chìa khóa** để cả mã hóa và giải mã. Giống như một chiếc hòm có một chiếc chìa duy nhất: bạn khóa hòm bằng chìa đó, và người nhận cũng phải dùng chính chiếc chìa đó để mở.

### 🛠️ Trong SonChat: AES-256-GCM
- **AES (Advanced Encryption Standard)**: Chuẩn mã hóa phổ biến nhất thế giới.
- **256-bit**: Độ dài khóa (rất khó để bẻ khóa bằng máy tính hiện nay).
- **GCM (Galois/Counter Mode)**: Một chế độ hoạt động cung cấp cả **Bảo mật** (Privacy) và **Xác thực** (Authenticity). Nó đảm bảo dữ liệu không bị thay đổi trong quá trình gửi.

### 🛡️ Bảo vệ khỏi thứ gì?
- **Kẻ trộm dữ liệu (Eavesdropping)**: Nếu ai đó bắt được gói tin trên mạng, họ chỉ thấy một mớ hỗn độn không có ý nghĩa.
- **Tấn công thay đổi dữ liệu (Tampering)**: Nhờ GCM, nếu kẻ xấu thay đổi dù chỉ 1 bit trong tin nhắn đã mã hóa, quá trình giải mã sẽ thất bại ngay lập tức.

### 📌 Tại sao dùng AES?
Vì AES rất **nhanh**. Nó có thể mã hóa hàng MB dữ liệu (như file, ảnh) trong tích tắc mà không gây tốn tài nguyên máy tính.

---

## 2. Mã hóa Bất đối xứng (Asymmetric Encryption) — RSA-2048

### 🔑 Khái niệm
Khác với AES, RSA sử dụng **một cặp khóa**:
1. **Public Key (Khóa công khai)**: Ai cũng có thể biết. Dùng để **Mã hóa**.
2. **Private Key (Khóa bí mật)**: Chỉ chủ sở hữu biết. Dùng để **Giải mã**.

Hãy tưởng tượng: Alice đưa cho mọi người một chiếc ổ khóa đã mở (Public Key). Ai muốn gửi thư cho Alice thì bỏ thư vào hộp rồi dùng ổ khóa đó khóa lại. Chỉ Alice có chìa (Private Key) mới mở được hộp đó.

### 🛠️ Trong SonChat: RSA-OAEP
- **RSA-2048**: Độ dài khóa 2048-bit, tiêu chuẩn an toàn hiện nay.
- **OAEP (Optimal Asymmetric Encryption Padding)**: Một kỹ thuật thêm dữ liệu ngẫu nhiên để làm cho RSA an toàn hơn trước các cuộc tấn công toán học.

### 🛡️ Bảo vệ khỏi thứ gì?
- **Lộ chìa khóa phiên**: Nếu chúng ta gửi chìa khóa AES trực tiếp qua mạng, kẻ xấu sẽ bắt được. RSA bảo vệ chính cái "chìa khóa AES" đó.
- **Giả mạo người nhận**: Chỉ người có Private Key tương ứng mới giải mã được chìa khóa AES để đọc tin nhắn.

### 📌 Tại sao dùng RSA?
Để giải quyết vấn đề: **Làm sao để gửi chìa khóa AES cho nhau mà không bị ai bắt trộm?** Chúng ta dùng RSA để mã hóa chính cái chìa khóa AES đó.

---

## 3. Hàm Băm (Hashing) — SHA-256

### 🧬 Khái niệm
Hàm băm là hàm **một chiều**. Nó biến một đoạn văn bản dài bất kỳ thành một "dấu vân tay" (hash) có độ dài cố định. Bạn không thể từ "dấu vân tay" này mà suy ngược lại văn bản gốc.

### 🛠️ Trong SonChat: SHA-256
Dùng để tạo ra một chuỗi kiểm tra (Checksum) cho mỗi tin nhắn.

### 🛡️ Bảo vệ khỏi thứ gì?
- **Tấn công trung gian (Man-in-the-Middle)**: Kẻ xấu có thể bắt tin nhắn, thay đổi nội dung (ví dụ: thay đổi số tiền trong hóa đơn) rồi gửi tiếp. 
- Khi nhận được, SonChat sẽ băm lại nội dung tin nhắn và so sánh với "dấu vân tay" đi kèm. Nếu lệch nhau, ứng dụng sẽ cảnh báo tin nhắn đã bị can thiệp.

---

## 4. Hashing Mật khẩu — BCrypt

### 🛠️ Tại Server
Server SonChat không lưu mật khẩu của bạn dưới dạng văn bản rõ. Thay vào đó, nó lưu **BCrypt Hash**.

### 🛡️ Bảo vệ khỏi thứ gì?
- **Lộ dữ liệu Server (Database Breach)**: Nếu database của server bị hack, kẻ xấu cũng không có mật khẩu của bạn. Chúng chỉ thấy các chuỗi BCrypt cực kỳ khó để giải mã ngược lại (Brute-force).

---

## 🔄 Luồng hoạt động tổng thể (End-to-End Encryption - E2EE)

Hãy xem cách 3 loại mã hóa trên phối hợp:

1. **Giai đoạn chuẩn bị (Client Alice)**:
   - Alice viết tin nhắn: "Chào Bob!".
   - Máy Alice tạo ra 1 **Khóa AES ngẫu nhiên** (khóa phiên).
   - Dùng **Khóa AES** mã hóa tin nhắn → **Tin nhắn mã hóa**.

2. **Giai đoạn trao đổi khóa (Key Exchange)**:
   - Alice lấy **Public Key của Bob** (lấy từ server).
   - Dùng **Public Key của Bob** mã hóa chính cái **Khóa AES** ở trên → **Khóa AES mã hóa**.

3. **Giai đoạn kiểm tra (Integrity)**:
   - Alice dùng **SHA-256** băm tin nhắn gốc → **Dấu vân tay (Hash)**.

4. **Gửi đi**:
   - Alice gửi lên Server: `{Tin nhắn mã hóa, Khóa AES mã hóa, Hash}`.
   - **Server** nhận được nhưng **không thể đọc** vì không có Private Key của Bob để mở "Khóa AES mã hóa".

5. **Giải mã (Client Bob)**:
   - Bob dùng **Private Key** của mình giải mã **Khóa AES mã hóa** → Lấy lại được **Khóa AES gốc**.
   - Dùng **Khóa AES gốc** giải mã **Tin nhắn mã hóa** → Đọc được: "Chào Bob!".
   - Bob băm lại tin nhắn và so sánh với **Hash** gửi kèm để đảm bảo không ai sửa tin nhắn.

---

## 💡 Tổng kết: Ai bảo vệ cái gì?

| Công nghệ | Tác dụng chính | Bảo vệ khỏi |
|-----------|----------------|-------------|
| **AES-256** | Mã hóa nội dung tin nhắn/file | Hacker nghe lén trên mạng |
| **RSA-2048** | Mã hóa và trao đổi Khóa AES | Server hoặc kẻ xấu trộm chìa khóa |
| **SHA-256** | Kiểm tra toàn vẹn dữ liệu | Kẻ xấu sửa đổi nội dung tin nhắn |
| **BCrypt** | Bảo vệ mật khẩu tại Server | Lộ database server |

**SonChat kết hợp tất cả các lớp này để đảm bảo: Chỉ có bạn và người nhận mới có thể đọc được nội dung chat.**
