Learning Outcome & Exercises: Cryptography
Tổng kết chương Cryptography: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/cryptography.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Phân biệt encoding, hash, HMAC, encryption bằng ví dụ Java chạy được.
- Hash password bằng BCrypt/Argon2 và giải thích salt, cost.
- Ký và xác minh JWT/payload bằng RSA, chứng minh chữ ký sai khi payload bị sửa.
2. Basic: Hash vs HMAC
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
SHA-256 và HmacSHA256 cho cùng một message; chứng minh đổi 1 byte làm MAC sai.
Bài liên quan: Encoding, hash, encryption, Hash & MAC
Hoàn thành khi:
- JUnit test
- So sánh constant-time
3. Intermediate: Password & AEAD
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
BCrypt cost 10 vs 12 (đo thời gian); AES-GCM mã hóa/giải mã, sửa ciphertext → lỗi xác thực.
Bài liên quan: Hash password, Symmetric & AEAD
Hoàn thành khi:
- Số đo cost
- Test tamper bị phát hiện
4. Challenge: Chữ ký số
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Ký JWT RS256 bằng key pair sinh lúc chạy, verify bằng public key; xoay key với kid.
Bài liên quan: RSA & chữ ký số, PKI & quản lý key
Hoàn thành khi:
- Test verify sai khi đổi payload
- Không commit private key
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | Hash vs HMAC | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Password & AEAD | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Chữ ký số | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/cryptography. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về Cryptography, câu nào hay gặp nhất và trả lời sao?
Q1. Vì sao không lưu password bằng SHA-256?
🇻🇳 Tiếng Việt:
SHA-256 rất nhanh nên brute-force rẻ. Password cần hàm chậm có salt như BCrypt hoặc Argon2 để mỗi lần thử tốn kém và hai password giống nhau ra hash khác nhau.
🇬🇧 English:
SHA-256 is very fast, so brute force is cheap. Passwords need a slow, salted function such as BCrypt or Argon2, so every guess is expensive and equal passwords produce different hashes.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (Hash vs HMAC) được coi là xong khi nào?
JUnit test; So sánh constant-time. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Password & AEAD) được coi là xong khi nào?
Số đo cost; Test tamper bị phát hiện. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Chữ ký số) được coi là xong khi nào?
Test verify sai khi đổi payload; Không commit private key. Chưa có code chạy và bằng chứng thì chưa tính là xong.