Hướng dẫn dùng hash algorithm trong PHP
Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ passwordKhi lưu trữ password vào CSDL thường sẽ sử dụng các hàm băm khác nhau được hỗ trợ bởi hệ CSDL hoặc ngôn ngữ lập trình (như MD5, SHA1 ...) để tạo dữ liệu mã hóa, dữ liệu mã hóa đó được lưu vào CSDL. Ví dụ: Show Ví dụ trên, đã sử dụng hàm băm của PHP là md5 để mã hóa password abc123, kết quả mã hóa là e99a18c428cb38d5f260853678922e03 Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược (không có thuật toán để giải giá trị hash e99a18c428cb38d5f260853678922e03 là chuỗi abc123, chỉ duy nhất một cách là thử), nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy e99a18c428cb38d5f260853678922e03 thì đoán được password là abc123. Để khắc phục điều này có thể sử dụng đến salt Sử dụng Salt tăng cường an toàn cho mật khẩuĐể phức tạp hóa mật khẩu lưu trữ, thì các mật khẩu gốc trước khi mã hóa được nối thêm các chuỗi, các chuỗi thêm này gọi là salt Ví dụ: $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);Giờ mật khẩu lưu trữ ở trên phức tạp hơn rất nhiều. Biết được $crypt đoán ra $raw_password là rất khó, kể cả khi là password yếu. Khó mà xây dựng được một từ điển chứa các mã hóa tương ứng với password. Hàm Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức. Có thể bạn quan tâmCú phápCú pháp: Trong đó:
Kết quả trả vềHàm sẽ trả về chuỗi được tính toán dưới dạng nhị phân nếu Bài viết này được đăng tại [free tuts .net] Ví dụMã hóa theo kiểu "ripemd160": Code echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.') . " Kết quả 5c6ffbdd40d9556b73a21e63c3e0e904 ec457d0a974c48d5685a7efa03d137dc8bbde7e3 Mã hóa theo kiểu "md5": Code echo hash('md5', 'The quick brown fox jumped over the lazy dog.') . " Kết quả 5c6ffbdd40d9556b73a21e63c3e0e904 5c6ffbdd40d9556b73a21e63c3e0e904 Tham khảo: php.net Hàm Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức. Cú phápCú pháp: Trong đó:
Kết quả trả vềHàm sẽ trả về chuỗi được tính toán dưới dạng nhị phân nếu Bài viết này được đăng tại [free tuts .net] Ví dụMã hóa theo kiểu "ripemd160": Code echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.') . " Kết quả 5c6ffbdd40d9556b73a21e63c3e0e904 ec457d0a974c48d5685a7efa03d137dc8bbde7e3 Mã hóa theo kiểu "md5": Code echo hash('md5', 'The quick brown fox jumped over the lazy dog.') . " Kết quả 5c6ffbdd40d9556b73a21e63c3e0e904 5c6ffbdd40d9556b73a21e63c3e0e904 Tham khảo: php.net Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ passwordKhi lưu trữ password vào CSDL thường sẽ sử dụng các hàm băm khác nhau được hỗ trợ bởi hệ CSDL hoặc ngôn ngữ lập trình (như MD5, SHA1 ...) để tạo dữ liệu mã hóa, dữ liệu mã hóa đó được lưu vào CSDL. Ví dụ: $raw_password = 'abc123'; $crypt = md5($raw_password); //e99a18c428cb38d5f260853678922e03Ví dụ trên, đã sử dụng hàm băm của PHP là md5 để mã hóa password abc123, kết quả mã hóa là e99a18c428cb38d5f260853678922e03 Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược (không có thuật toán để giải giá trị hash e99a18c428cb38d5f260853678922e03 là chuỗi abc123, chỉ duy nhất một cách là thử), nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy e99a18c428cb38d5f260853678922e03 thì đoán được password là abc123. Để khắc phục điều này có thể sử dụng đến salt Sử dụng Salt tăng cường an toàn cho mật khẩuĐể phức tạp hóa mật khẩu lưu trữ, thì các mật khẩu gốc trước khi mã hóa được nối thêm các chuỗi, các chuỗi thêm này gọi là salt Ví dụ: $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);Giờ mật khẩu lưu trữ ở trên phức tạp hơn rất nhiều. Biết được $crypt đoán ra $raw_password là rất khó, kể cả khi là password yếu. Khó mà xây dựng được một từ điển chứa các mã hóa tương ứng với password. |