Kỹ thuật “password hashing” trong cơ sở dữ liệu

Khi lưu password trong cơ sở dữ liệu (database) người ta thường dùng kỹ thuật “password hashing” chứ không lưu trực tiếp password. Chúng ta sẽ cùng tìm hiểu về kỹ thuật này trong bài viết này.

Ví dụ chúng ta có một website, và ta cần lưu thông tin về người dùng (user) trong database. Database sẽ lưu giữ thông tin về “username”, “password”, và một số thông tin quan trọng khác của user. Khi đó, chúng ta phải đổi mặt với một mối đe doạ về bảo mật thông tin ở đây. Database lưu lại password của user để khi user đăng nhập vào hệ thống chúng ta có thể kiểm tra được password mà user nhập vào có đúng với password mà user đã đăng ký hay không. Nếu bằng cách nào đó database của chúng ta bị xâm phạm (bởi các lực lượng bên ngoài hoặc bên trong, bên trong ở đây có thể là chính người quản trị cơ sở dữ liệu, bên ngoài ở đây có thể là các hacker, kẻ phá hoại,…) thì tất cả các thông tin về user trong đó có password sẽ bị lộ. Đây chính là lý do mà chúng ta cần đến kỹ thuật gọi là “password hashing” – mã hoá password bằng hash function.

Thay về lưu password dưới dạng plaintext (dạng text bình thường mà con người có thể đọc hiểu được) thì password sẽ được đưa vào một hash function, hash value sinh ra từ hash function sẽ được dùng để lưu và database đại diện cho password. Tức là ta sẽ lưu vào database hash value của password chứ không lưu trực tiếp password. Khi user đăng nhập thì ta cũng làm tương tự, password mà user nhập vào sẽ được đưa vào hash function lúc đầu để tính ra hash value, hash value này sẽ được dùng để so sánh với hash value lưu trong database, nêu giống nhau thì có nghĩa là user đã nhâp đúng password và ngược lại. Bằng cách này thì nếu chẳng may database bị lấy trộm hoặc bị lộ ra ngoài thì kẻ xấu cũng chỉ biết hash value của password chứ không biết password thật là gì. Sẽ mất rất nhiều thời gian để tìm ra hoặc thậm chí không thể tìm ra được password thật của một user nào đó, nhờ đó giảm thiếu rủi ro cho hệ thống.

Cụ thể, giả sử Tuấn đăng ký tài khoản trên trang web với username là “tuanpm” và password là “tuandeptrai“, webserver sử dụng thuật toán MD5 để tính hash value của password và lưu xuống database. MD5 hash value của “tuandeptrai” là “5ADBA954A11C3FC0DFDFFE132A96A53A” nên thông tin tài khoản của Tuấn trong database sẽ kiểu như sau:

Bây giờ, khi Tuấn đăng nhập những lần sau, nếu Tuấn nhập “tuandeptrai” vào ô password thì webserver sẽ tính MD5 hash value của “tuandeptrai” và cho ra kết quả là “5ADBA954A11C3FC0DFDFFE132A96A53A“, sau đó dùng kết quả này so sánh với password lưu trong database, trường hợp này sẽ cho kết quả là giống nhau nên Tuấn sẽ đăng nhập thành công.

Nếu Tuấn nhập “phamminhtuan” vào ô password thay vì “tuandeptrai” thì MD5 hash value mà webserver tính ra sẽ là “9F07C90F2EBCA70A5C85824B0825BCE7“. Khi so sánh “9F07C90F2EBCA70A5C85824B0825BCE7” với password lưu trong database là “5ADBA954A11C3FC0DFDFFE132A96A53A” sẽ cho ra kết quả là khác nhau nên Tuấn sẽ đăng nhập không thành công.

Tham khảo

— Phạm Minh Tuấn (Shun) —

Xem thêm

Hash function là gì ? | Ứng dụng của hash function