Cần phải nói rằng bcrypt hay SHA-512 (trong bối cảnh của một thuật toán thích hợp như PBKDF2) là đủ tốt . Và câu trả lời là có, một trong hai thuật toán đủ an toàn để vi phạm sẽ xảy ra thông qua lỗ hổng triển khai, chứ không phải phân tích mật mã.
Nếu bạn khăng khăng muốn biết cái nào "tốt hơn", SHA-512 đã được NIST và những người khác đánh giá sâu. Thật tốt, nhưng sai sót đã được công nhận rằng, trong khi không thể khai thác được, đã dẫn đến cuộc cạnh tranh SHA-3 cho các thuật toán băm mới. Ngoài ra, hãy nhớ rằng nghiên cứu về thuật toán băm là "mới hơn" so với thuật toán mã hóa và các nhà mật mã học vẫn đang tìm hiểu về chúng.
Mặc dù toàn bộ bcrypt không có nhiều sự xem xét kỹ lưỡng như chính blowfish, tôi tin rằng việc dựa trên một mật mã có cấu trúc được hiểu rõ sẽ mang lại cho nó một sự bảo mật vốn có mà xác thực dựa trên hàm băm thiếu. Ngoài ra, việc sử dụng các GPU thông thường như một công cụ để tấn công các băm dựa trên SHA-2 dễ dàng hơn; do yêu cầu bộ nhớ của nó, việc tối ưu hóa bcrypt đòi hỏi phần cứng chuyên dụng hơn như FPGA với một số RAM tích hợp.
Lưu ý: bcrypt là một thuật toán sử dụng Blowfish trong nội bộ. Bản thân nó không phải là một thuật toán mã hóa. Nó được sử dụng để che giấu mật khẩu không thể đảo ngược, giống như các hàm băm được sử dụng để thực hiện "băm một chiều".
Các thuật toán băm mật mã được thiết kế để không thể đảo ngược. Nói cách khác, chỉ được cung cấp đầu ra của hàm băm, phải mất "mãi mãi" để tìm một thông báo sẽ tạo ra cùng một đầu ra băm. Trong thực tế, không thể tính toán được bất kỳ hai thông báo nào tạo ra cùng một giá trị băm. Không giống như mật mã, các hàm băm không được tham số hóa bằng khóa; cùng một đầu vào sẽ luôn luôn tạo ra cùng một đầu ra.
Nếu ai đó cung cấp mật khẩu băm cho giá trị được lưu trong bảng mật khẩu, họ sẽ được xác thực. Cụ thể, do tính không thể đảo ngược của hàm băm, người ta cho rằng người dùng không phải là kẻ tấn công đã giữ băm và đảo ngược nó để tìm mật khẩu hoạt động.
Bây giờ hãy xem xét bcrypt. Nó sử dụng Blowfish để mã hóa một chuỗi ma thuật, sử dụng khóa "xuất phát" từ mật khẩu. Sau đó, khi người dùng nhập mật khẩu, khóa sẽ được lấy lại và nếu bản mã được tạo bằng cách mã hóa với khóa đó khớp với bản mã được lưu trữ, người dùng sẽ được xác thực. Bản mã được lưu trữ trong bảng "mật khẩu", nhưng khóa dẫn xuất không bao giờ được lưu trữ.
Để phá vỡ mật mã ở đây, kẻ tấn công sẽ phải khôi phục khóa từ bản mã. Đây được gọi là một cuộc tấn công "đã biết rõ", vì cuộc tấn công biết chuỗi ma thuật đã được mã hóa, nhưng không phải là khóa được sử dụng. Blowfish đã được nghiên cứu rộng rãi, và chưa có cuộc tấn công nào được biết sẽ cho phép kẻ tấn công tìm thấy chìa khóa với một bản rõ duy nhất được biết đến.
Vì vậy, giống như các thuật toán mã hóa dựa trên thuật toán không thể đảo ngược, bcrypt tạo ra một đầu ra không thể đảo ngược, từ mật khẩu, muối và yếu tố chi phí. Sức mạnh của nó nằm ở khả năng chống lại các cuộc tấn công bằng văn bản đã biết của Blowfish, tương tự như "cuộc tấn công tiền ảnh đầu tiên" trên thuật toán tiêu hóa. Vì nó có thể được sử dụng thay cho thuật toán băm để bảo vệ mật khẩu, bcrypt được gọi một cách khó hiểu là chính thuật toán "băm".
Giả sử rằng các bảng cầu vồng đã bị cản trở bởi việc sử dụng muối đúng cách, bất kỳ chức năng thực sự không thể đảo ngược nào cũng làm giảm kẻ tấn công đến thử và sai. Và tốc độ mà kẻ tấn công có thể thực hiện các thử nghiệm được xác định bởi tốc độ của thuật toán "băm" không thể đảo ngược đó. Nếu một lần lặp duy nhất của hàm băm được sử dụng, kẻ tấn công có thể thực hiện hàng triệu thử nghiệm mỗi giây bằng cách sử dụng thiết bị có giá 1000 đô la, kiểm tra tất cả mật khẩu dài tới 8 ký tự trong vài tháng.
Tuy nhiên, nếu đầu ra tiêu hóa được "phản hồi" hàng ngàn lần, sẽ mất hàng trăm năm để kiểm tra cùng một bộ mật khẩu trên phần cứng đó. Bcrypt đạt được hiệu ứng "tăng cường khóa" tương tự bằng cách lặp lại bên trong thói quen phái sinh chính của nó và một phương pháp dựa trên hàm băm thích hợp như PBKDF2 cũng làm điều tương tự; về mặt này, hai phương pháp là tương tự nhau.
Vì vậy, khuyến nghị của tôi về bcrypt bắt nguồn từ các giả định 1) rằng một con Cá đuối có mức độ xem xét tương tự như họ hàm băm SHA-2 và 2) rằng các phương thức mã hóa cho mật mã được phát triển tốt hơn so với các hàm băm.