Bạn có thể sử dụng nhiều hàm băm trong cơ sở dữ liệu của mình, nó chỉ cần thêm một chút nỗ lực. Tuy nhiên, điều đó rất xứng đáng nếu bạn nghĩ rằng có cơ hội từ xa bạn sẽ cần hỗ trợ các định dạng bổ sung trong tương lai. Tôi thường sử dụng các mục nhập mật khẩu như
{hashId} $ {salt} $ {hash password}
trong đó "hashId" chỉ là một số tôi sử dụng nội bộ để nhận ra điều đó, ví dụ: tôi đang sử dụng SHA1 với một mẫu băm cụ thể; "salt" là một muối ngẫu nhiên được mã hóa base64; và "mật khẩu băm" là một mã băm được mã hóa base64. Nếu bạn cần di chuyển hàm băm, bạn có thể chặn mọi người bằng định dạng mật khẩu cũ và yêu cầu họ thay đổi mật khẩu vào lần đăng nhập tiếp theo.
Như những người khác đã đề cập, bạn muốn cẩn thận với hàm băm của mình vì rất dễ làm điều gì đó không thực sự an toàn, ví dụ: H (muối, mật khẩu) yếu hơn nhiều so với H (mật khẩu, muối), nhưng đồng thời bạn cũng muốn cân bằng nỗ lực dành cho việc này với giá trị của nội dung trang web. Tôi sẽ thường sử dụng H (H (mật khẩu, muối), mật khẩu).
Cuối cùng, chi phí của việc sử dụng mật khẩu được mã hóa base64 là khiêm tốn khi so sánh với lợi ích của việc có thể sử dụng các công cụ khác nhau mong đợi dữ liệu văn bản. Vâng, chúng sẽ linh hoạt hơn, nhưng bạn đã sẵn sàng nói với sếp của mình rằng ông ấy không thể sử dụng công cụ bên thứ ba yêu thích của mình vì bạn muốn tiết kiệm một vài byte mỗi bản ghi không? :-)
Đã chỉnh sửa để thêm một nhận xét khác: nếu tôi đề nghị cố tình sử dụng một thuật toán đốt cháy ngay cả 1/10 giây băm mỗi mật khẩu, tôi sẽ may mắn chỉ bị cười ra khỏi văn phòng của sếp. (Không may mắn như vậy? Anh ấy sẽ ghi lại điều gì đó để thảo luận trong bài đánh giá hàng năm tiếp theo của tôi.) Đốt cháy thời gian đó không phải là vấn đề khi bạn có hàng chục, thậm chí hàng trăm người dùng. Nếu bạn đang thúc đẩy 100k người dùng, bạn thường sẽ có nhiều người đăng nhập cùng một lúc. Bạn cần một cái gì đó nhanh và mạnh, không phải chậm và mạnh. "Nhưng còn thông tin thẻ tín dụng thì sao?" tốt nhất là không cần thiết vì thông tin thẻ tín dụng được lưu trữ không nên ở bất kỳ đâu gần cơ sở dữ liệu thông thường của bạn và sẽ được mã hóa bởi ứng dụng, không phải người dùng cá nhân.