Mục lục

Mật khẩu & Mã hóa: Tại sao MD5 đã chết?

Hướng dẫn lưu trữ Password an toàn tuyệt đối. Phân biệt Hashing và Encryption. Tại sao bạn phải dùng Argon2/Bcrypt thay vì MD5/SHA1?

Case Study kinh điển: Adobe bị hack năm 2013, lộ 150 triệu mật khẩu user. Vấn đề? Họ "Mã hóa" mật khẩu thay vì "Băm" (Hash) chúng.

1. Hashing vs Encryption (Khác nhau một trời một vực)

  • Encryption (Mã hóa): Hai chiều. Khóa vào -> Dùng chìa mở ra được.

    • Dùng cho: Số thẻ tín dụng, tin nhắn riêng tư.
    • KHÔNG DÙNG CHO PASSWORD. (Vì nếu hacker trộm được chìa khóa, hắn giải mã được hết).
  • Hashing (Băm): Một chiều. Thịt băm rồi không thể ghép lại thành con lợn.

    • 123456 -> e10adc3949ba59abbe56e057f20f883e.
    • Dùng cho: Password. Hacker lấy được Hash cũng không suy ngược ra Password được (về lý thuyết).

2. Tại sao MD5/SHA-1 đã chết?

Ngày nay, GPU (Card đồ họa) mạnh đến mức có thể thử hàng tỷ password mỗi giây.

  • MD5 của 123456 bị giải mã trong 0.000001 giây.
  • Nó quá NHANH. Với Hashing, Nhanh = Không an toàn.

Chúng ta cần một thuật toán CHẬM (Slow Hashing) để làm nản lòng Hacker.

3. The Salt (Gia vị)

Nếu User A và User B cùng đặt pass là helloworld. Hash của họ sẽ giống hệt nhau. Hacker chỉ cần giải mã 1 người là biết người kia. -> Salt: Thêm một chuỗi ngẫu nhiên vào password trước khi băm. Hash("helloworld" + "random_salt_A") != Hash("helloworld" + "random_salt_B").

4. Chuẩn công nghiệp 2024: Argon2 & Bcrypt

Bcrypt (Phổ biến)

Ra đời 1999 nhưng vẫn rất tốt. Nó tự động thêm Salt và cho phép chỉnh độ khó (Work Factor).

ts:
import bcrypt from 'bcryptjs';

// 1. Hash (Khi đăng ký)
const saltRounds = 12; // Mất khoảng 200-300ms để hash
const hashedPassword = await bcrypt.hash('mypassword', saltRounds);
// Lưu hashedPassword vào DB

// 2. Compare (Khi đăng nhập)
const isValid = await bcrypt.compare('inputpassword', storedHashedPassword);

Người chiến thắng cuộc thi Password Hashing Competition 2015. Nó được thiết kế để chống lại sự tấn công của GPU/ASIC chuyên dụng. Nếu bạn bắt đầu dự án mới, hãy dùng Argon2 via lucia-auth hoặc node-argon2.

5. Quy tắc vàng

  1. KHÔNG BAO GIỜ tự viết hàm Hash.
  2. KHÔNG BAO GIỜ lưu password dạng text (Plain text).
  3. CHẬM LÀ TỐT: Login chậm đi 0.5s không sao, nhưng Database an toàn hơn tỷ lần.

Kết luận

Lưu password là trách nhiệm đạo đức của Developer. Dùng thuật toán đúng (Bcrypt/Argon2) là bảo vệ người dùng và chính bạn khỏi thảm họa pháp lý.

Quảng cáo
mdhorizontal