Troy Hunt đưa ra một số điểm tuyệt vời trong bài viết của mình, Mọi thứ bạn từng muốn biết về việc xây dựng tính năng đặt lại mật khẩu an toàn . Các trích đoạn có liên quan nhất là:
[T] đây là hai cách tiếp cận phổ biến:
- Tạo mật khẩu mới trên máy chủ và gửi email
- Gửi email một URL duy nhất sẽ tạo điều kiện cho quá trình đặt lại
Mặc dù có rất nhiều hướng dẫn ngược lại, điểm đầu tiên thực sự không phải là nơi chúng ta muốn. Vấn đề với việc này là nó có nghĩa là một mật khẩu liên tục - mật khẩu bạn có thể quay lại và sử dụng bất cứ lúc nào - hiện đã được gửi qua một kênh không an toàn và nằm trong hộp thư đến của bạn.
...
Nhưng có một vấn đề lớn hơn với cách tiếp cận đầu tiên ở chỗ nó làm cho việc khóa tài khoản độc hại trở nên đơn giản. Nếu tôi biết địa chỉ email của một người sở hữu tài khoản tại một trang web thì tôi có thể khóa chúng khỏi tài khoản đó bất cứ khi nào tôi muốn chỉ bằng cách đặt lại mật khẩu của họ; đó là tấn công từ chối dịch vụ phục vụ trên một đĩa bạc! Đây là lý do tại sao thiết lập lại là điều chỉ nên xảy ra sau khi xác minh thành công quyền của người yêu cầu thực hiện.
Khi chúng tôi nói về một URL đặt lại, chúng tôi đang nói về một địa chỉ trang web duy nhất cho trường hợp cụ thể này của quy trình đặt lại.
...
Những gì chúng tôi muốn làm là tạo một mã thông báo duy nhất có thể được gửi trong email dưới dạng một phần của URL đặt lại, sau đó khớp lại với một bản ghi trên máy chủ cùng với tài khoản của người dùng, do đó xác nhận chủ sở hữu tài khoản email thực sự là người cố gắng đặt lại mật khẩu. Ví dụ: mã thông báo có thể là Mã 3ce7854015cd38c862cb9e14a1ae552b thép và được lưu trữ trong một bảng cùng với ID của người dùng thực hiện đặt lại và thời gian mã thông báo được tạo ra (nhiều hơn trong một khoảnh khắc). Khi email được gửi đi, nó chứa một URL như là Reset Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b, và khi người dùng tải cái này, trang sẽ kiểm tra sự tồn tại của mã thông báo và do đó xác nhận danh tính của người dùng và cho phép xác nhận danh tính của người dùng được thay đổi.
...
Một điều khác mà chúng tôi muốn làm với URL đặt lại là giới hạn thời gian mã thông báo để quá trình đặt lại phải được hoàn thành trong một khoảng thời gian nhất định, giả sử trong vòng một giờ.
...
Cuối cùng, chúng tôi muốn đảm bảo rằng đây là quy trình một lần. Khi quá trình đặt lại hoàn tất, mã thông báo sẽ bị xóa để URL đặt lại không còn hoạt động. Cũng như điểm trước, điều này là để đảm bảo kẻ tấn công có một cửa sổ rất hạn chế trong đó chúng có thể lạm dụng URL đặt lại. Tất nhiên, mã thông báo không còn cần thiết nếu quá trình đặt lại hoàn tất thành công.
Anh ta đưa ra nhiều điểm tốt hơn về việc tránh rò rỉ thông tin, CAPTCHA, xác thực hai yếu tố và tất nhiên là các cách thực hành cơ bản tốt nhất như băm mật khẩu. Tôi nghĩ điều quan trọng cần lưu ý là tôi không đồng ý với Troy về tính hữu ích của các câu hỏi bảo mật, thích sự hoài nghi của Bruce Schneier về thực tiễn :
Điểm của tất cả những câu hỏi này là như nhau: mật khẩu dự phòng. Nếu bạn quên mật khẩu, câu hỏi bí mật có thể xác minh danh tính của bạn để bạn có thể chọn một mật khẩu khác hoặc để trang web gửi e-mail mật khẩu hiện tại của bạn cho bạn. Đó là một ý tưởng tuyệt vời từ góc độ dịch vụ khách hàng - người dùng ít có khả năng quên tên thú cưng đầu tiên của mình hơn một số mật khẩu ngẫu nhiên - nhưng rất tệ cho bảo mật. Câu trả lời cho câu hỏi bí mật dễ đoán hơn nhiều so với mật khẩu tốt và thông tin công khai hơn nhiều.