Thêm muối vào quá trình đăng ký
Vậy là bạn đã biết rằng việc băm bằng
md5 là quá trình không thể đảo ngược và hacker,
dù có truy cập được vào hash, cũng không thể lấy được
mật khẩu từ hash đó.
Thực tế khẳng định này không hoàn toàn đúng - hiện tại, các hacker xấu đã lập nên thư viện các hash của những mật khẩu phổ biến và không quá phổ biến, và bất kỳ kẻ ngốc nào cũng có thể giải mã mật khẩu, chỉ bằng cách tìm kiếm hash của nó trên Google.
Đó là những mật khẩu khá đơn giản, phổ biến.
Hãy thử tìm kiếm trên Google, ví dụ, hash 827ccb0eea8a706c4c34a16891f84e7b
và ngay lập tức trong kết quả tìm kiếm của Google bạn sẽ thấy, đó là
mật khẩu '12345'.
Hash của những mật khẩu đủ phức tạp thì không thể giải mã theo cách này (hãy thử xem).
Bạn có thể hỏi, vậy vấn đề ở đây là gì - hãy để tất cả chúng ta đăng ký với những mật khẩu phức tạp. Tuy nhiên, có một vấn đề - đa số người dùng không nghĩ đến tính bảo mật của dữ liệu của họ và có thể nhập những mật khẩu khá đơn giản.
Chúng ta có thể trong quá trình đăng ký bắt buộc họ nghĩ ra
mật khẩu dài hơn, bằng cách giới hạn, ví dụ,
số ký tự tối thiểu là 6
hoặc 8, tuy nhiên, vẫn sẽ xuất hiện
những mật khẩu dạng '123456' hoặc '12345678'.
Tất nhiên, có thể nghĩ ra một thuật toán thông minh hơn để kiểm tra độ phức tạp của mật khẩu, nhưng có một giải pháp khác.
Bản chất của giải pháp này như sau: mật khẩu cần được thêm muối. Muối - là một chuỗi ngẫu nhiên đặc biệt, sẽ được thêm vào mật khẩu khi đăng ký và hash sẽ được tính không phải từ mật khẩu thông thường, mà từ chuỗi muối+mật khẩu, tức là từ mật khẩu đã được thêm muối.
Tức là khi đăng ký bạn sẽ làm đại loại như thế này:
<?php
$salt = '1sJg3hfdf'; // muối - chuỗi ngẫu nhiên phức tạp
$password = md5($salt . $_POST['password']); // chuyển đổi mật khẩu thành hash đã thêm muối
?>
Khi đó muối sẽ khác nhau cho mỗi người dùng, nó cần được tạo ngẫu nhiên vào thời điểm đăng ký.
Đây là hàm đã hoàn chỉnh, sẽ thực hiện việc đó:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // độ dài của muối
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // ký tự từ bảng ASCII
}
return $salt;
}
?>
Với hàm này có thể viết lại mã của chúng ta như sau:
<?php
$salt = generateSalt(); // muối
$password = md5($salt . $_POST['password']); // mật khẩu đã thêm muối
?>
Nhắc lại một lần nữa, đây là những thay đổi khi đăng ký - trong CSDL chúng ta lưu không phải chỉ hash của mật khẩu, mà là hash của mật khẩu đã thêm muối.
Vẫn chưa hết: trong bảng người dùng ngoài
trường login và password cần
tạo thêm trường salt, trong đó
chúng ta sẽ lưu muối của từng người dùng.
Hãy thực hiện quá trình đăng ký với mật khẩu đã thêm muối như đã mô tả ở trên.