Hash password cùng với salt, đơn giản nhưng hiệu quả

Chém gió vu vơ

Hồi xưa thời sinh viên cách đây 3-4 năm, cứ động đến bài toán nào mà có mật khẩu người dùng là mình lưu vào database dạng plain text. Hồi đó khi làm mấy project ở trường, mình thường chỉ quan tâm nó chạy được hay không (chạy được thì có khả năng 10 nhưng không chạy được thì chắc chắn ăn zero 😀 ) chứ không quan tâm đến vấn đề bảo mật lắm. Khi ra đi làm, project đầu tiên mình làm về một ứng dụng chat bảo mật, vì bảo mật ghê quá, phức tạp quá nên đến giờ mình vẫn theo dự án đó, không dài lắm, mới 2 năm thôi. Dài dòng thế đủ rồi, bài hôm nay mình sẽ nói về việc hash password của user thế nào cho đúng.

Tại sao phải hash password?

Password của user thì chỉ có mình họ biết thôi, mình hash rồi lưu xuống database để lỡ database có bị hack thì thằng hacker sẽ không đọc được password.

Hash password thời sinh viên

Hồi xưa bạn nào tiến bộ một chút thì sẽ xử lý bài toán đăng nhập như thế này:

  1. User đăng ký tài khoản, password user được hash và lưu vào database
  2. Lúc đăng nhập, hash password mà user nhập vào rồi so sánh với password đã hash trong database, đúng thì cho vô, không đúng thì bye.

Mới nhìn qua thì cách này có vẻ hay nhưng nghĩ kỹ một tí thì nó ẩn chứa sai lầm chết người.

Hash của một chuỗi cố định thì đầu ra luôn là cố định.

Ví dụ: hash(“password”) luôn là 5f4dcc3b5aa765d61d8327deb882cf99, thuật toán hash md5.

Như vậy nếu hacker lấy được database của mình, nó sẽ đi hash những password trong một tập hợp password mà người ta hay sử dụng(123456, abcd123, …) rồi so sánh với password hash trong database của mình, nếu trùng nhau thì nó mò được password rồi. Cách này gọi là dictionary attacks. Còn một loại kinh hơn là brute-force attacks, khỏi cần dictionary luôn, nó sẽ duyệt tất cả các tổ hợp password có thể có, hash rồi so sánh để tìm đúng password.

Khi nó tìm được một password thì user nào có password giống nhau thì tiêu hết.

Như vậy bài toán đặt ra là làm sao mà cho dù password user có giống nhau thì khi hash vẫn ra kết quả khác nhau.

Salt ngẫu nhiên

Salt chính là chuỗi random được thêm vào để hash cùng với password, điều này đảm bảo user password hash không trùng nhau.

Salt dài bao nhiêu là được?

Theo mình biết thì tùy theo thuật toán hash, salt có độ dài tối thiểu bằng độ dài của hash output. Ví dụ:
1. md5 -> Output 16 bytes -> Salt tối thiểu 16 bytes.
2. sha-1 -> Output 20 bytes -> Salt tối thiểu 20 bytes.
3. sha-256 -> Output 32 bytes -> Salt tối thiểu 32 bytes.

Kết luận

Thêm salt vào là một cách tăng cường bảo mật cho password, một cách nữa là dùng những thuật toán hash chạy chậm ở mức độ chấp nhận để làm hacker mất nhiều thời gian hơn và sẽ nhanh chóng bỏ cuộc :)) Phần này để giành cho bài sau.

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

4 Comments on "Hash password cùng với salt, đơn giản nhưng hiệu quả"

Notify of
avatar
Sort by:   newest | oldest | most voted
Anonymous
Guest

Hay

trần lê phương bình
Guest
trần lê phương bình

Hello Cao Quang Binh :),

Đọc bài của bạn mình thấy ok, nhưng bạn có thể giải thích rõ hơn được về salt random, server sẽ lấy cái hash random ở đâu để phân giải ngược về original hash code?

Thank you,

Best Regards,

trần lê phương bình
Guest
trần lê phương bình

Sorry minh nham !

Hello Tac Gia