Mật khẩu băm MD5 không thể hoàn nguyên. (MD5 là băm, và không thực sự mã hóa, do đó, có một sự khác biệt tinh tế). Và có bạn chắc chắn sẽ muốn cung cấp một quy trình "đặt lại" mật khẩu (và không chỉ đơn giản là gửi mật khẩu qua email).
Để cung cấp cho bạn một công việc ở mức cao cho reset mật khẩu an toàn ...
- Khi người dùng yêu cầu để thiết lập lại mật khẩu của họ, làm cho họ nhập địa chỉ email của họ
- Đừng cho biết nếu email mà địa chỉ là hợp lệ hay không (chỉ cần nói với họ rằng một email đã được gửi đi). Điều này mở để tranh luận vì nó làm giảm khả năng sử dụng (nghĩa là tôi không biết mình đã đăng ký email nào) nhưng nó cung cấp ít thông tin hơn cho những người đang cố thu thập thông tin về những email thực sự được đăng ký trên trang web của bạn.
- Tạo mã thông báo (có thể băm dấu thời gian bằng muối) và lưu nó vào cơ sở dữ liệu trong hồ sơ của người dùng.
- Gửi email cho người dùng cùng với liên kết tới trang http s đặt lại của bạn (mã thông báo và địa chỉ email trong url).
- Sử dụng mã thông báo và địa chỉ email để xác thực người dùng.
- Cho phép họ chọn mật khẩu mới, thay thế mật khẩu cũ.
- Ngoài ra, bạn nên hết hạn các mã thông báo sau một khung thời gian nhất định, thường là 24 giờ.
- Tùy chọn, ghi lại số lần thử "quên" đã xảy ra và có thể triển khai nhiều chức năng phức tạp hơn nếu mọi người đang yêu cầu một tấn email.
- Tùy chọn, ghi lại (trong một bảng riêng biệt) địa chỉ IP của cá nhân yêu cầu đặt lại. Tăng số lượng từ IP đó. Nếu nó đạt đến nhiều hơn, ví dụ, 10 ... Bỏ qua các yêu cầu tương lai của họ.
Để cung cấp cho bạn một ít chi tiết hơn vào băm ...
Khi bạn băm một giá trị như một mật khẩu bằng cách sử dụng md5() trong PHP, giá trị cuối cùng sẽ là như nhau cho mật khẩu đó bất kể bạn chạy máy chủ nào. (Vì vậy, có một sự khác biệt mà chúng ta có thể thấy ngay lập tức giữa băm và mã hóa ... Không có khóa riêng tư/công khai nào liên quan).
Vì vậy, đây là nơi bạn sẽ thấy mọi người đề cập đến lỗ hổng đối với rainbow tables. Một giải thích rất cơ bản của một bảng cầu vồng là ... Bạn md5() băm một loạt các từ điển (mật khẩu yếu) để có được giá trị băm md5() của chúng. Đặt những người trong một bảng cơ sở dữ liệu (bảng cầu vồng).
Bây giờ, nếu bạn thỏa hiệp cơ sở dữ liệu của trang web, bạn có thể chạy mật khẩu băm của người dùng đối với bảng cầu vồng của bạn (về bản chất) "đảo ngược" hàm băm trở lại mật khẩu. (Bạn không thực sự "đảo ngược" băm ... Nhưng bạn có được ý tưởng).
Đó là nơi "ăn mặn" mật khẩu của bạn là phương pháp hay nhất. Điều này có nghĩa là (một lần nữa, ý tưởng rất cơ bản ở đây) mà bạn thêm một giá trị ngẫu nhiên vào mật khẩu của người dùng trước khi bạn băm nó. Bây giờ, khi bảng cầu vồng chạy trên cơ sở dữ liệu của bạn, nó không dễ dàng "đảo ngược" bởi vì md5() của "mật khẩu" khác với "password384746".
Đây là một SO Q/A tốt đẹp sẽ hữu ích. Secure hash and salt for PHP passwords
Nguồn
2011-07-05 16:10:11
Toàn bộ ý tưởng lưu trữ mật khẩu MD5 được mã hóa là bạn không thể giải mã chúng. Ngay cả khi ai đó đột nhập vào hệ thống của bạn và kết xuất DB họ không thể nhận được mật khẩu (trừ khi tất nhiên mật khẩu yếu, nhưng đó là một câu chuyện khác ...) –