Không phải không có SSL
Điều này không an toàn nếu mật khẩu được gửi qua mạng bằng văn bản thuần túy. Băm mật khẩu ở phía máy chủ cũng không an toàn nếu mật khẩu được gửi qua mạng ở dạng văn bản thuần túy.
Vì <input type="password"/>
thẻ HTML gửi nội dung của nó ở dạng văn bản đơn giản, đây sẽ là một vấn đề cho dù bạn lưu trữ mật khẩu trên máy chủ như thế nào, trừ khi trang web của bạn sử dụng SSL để truyền mật khẩu.
(Xác thực HTTP, bật lên hộp thoại trong trình duyệt yêu cầu mật khẩu, có thể có hoặc không có văn bản rõ ràng, tùy thuộc vào cơ chế xác thực nào mà máy chủ và trình duyệt có điểm chung. Vì vậy, đó có thể là một cách để tránh điều này mà không sử dụng SSL.)
Không, nếu quản trị viên trang web nghi ngờ
Bây giờ, giả sử bạn đang sử dụng HTTPS để làm trang web, điều này có thể an toàn nếu bạn tin tưởng quản trị viên trang web của mình (người có thể đọc mật khẩu văn bản đơn giản) và những người khác có quyền truy cập vào máy để hành xử đúng. Bây giờ, có thể rõ ràng là họ có thể làm bất cứ điều gì họ muốn với trang web của bạn (vì họ quản trị nó), nhưng nếu họ có thể đọc mật khẩu, họ cũng có thể sử dụng các cặp đăng nhập / mật khẩu bị đánh cắp trên các trang web của người khác.
Một cách giữ mật khẩu an toàn từ quản trị viên
Một cách an toàn để lưu trữ và kiểm tra mật khẩu như sau:
def change_password user, new_password
salt = random(65536).to_s(16) #will be 4 characters long
password_hash = salt + hash(salt + new_password)
store(user,password_hash)
end
def does_password_match? user, entered_password
correct_password_hash = retrieve(user)
salt = correct_password_hash[0...4]
entered_password_hash = salt + hash(salt + entered_password)
return correct_password_hash == entered_password_hash
end
Đối với hàm băm, hãy thử sử dụng thứ gì đó mạnh và thứ gì đó chưa có bảng cầu vồng tốt trong tự nhiên. Bạn có thể thay đổi độ dài của muối nếu cần thiết xung quanh các bảng cầu vồng.
Tùy thuộc vào môi trường bạn đang ở, độ biến thiên trong độ trễ mạng của bạn và liệu tên người dùng có được biết đến công khai hay không, bạn có thể muốn tính toán một đường dẫn mã khác hash('0000'+entered_password)
nếu người dùng không tồn tại, để ngăn chặn kẻ tấn công xác định tên người dùng nào là hợp lệ dựa trên thời gian xác định rằng mật khẩu không chính xác.