SHA512 so với blowfish và Bcrypt [đã đóng]


222

Tôi đang xem các thuật toán băm, nhưng không thể tìm thấy câu trả lời.

  • Bcrypt sử dụng blowfish
  • Blowfish tốt hơn MD5
  • Q: nhưng liệu blowfish có tốt hơn SHA512 không?

Cảm ơn..

Cập nhật:

Tôi muốn làm rõ rằng tôi hiểu sự khác biệt giữa băm và mã hóa. Điều khiến tôi đặt câu hỏi theo cách này là bài viết này , trong đó tác giả gọi bcrypt là "băm thích ứng"

Vì bcrypt dựa trên Blowfish, tôi đã được dẫn đến việc nghĩ rằng Blowfish là một thuật toán băm. Nếu đó là mã hóa như câu trả lời đã chỉ ra, thì dường như tôi không nên có một vị trí trong bài viết này. Điều tồi tệ hơn là anh ấy kết luận rằng bcrypt là tốt nhất. Điều tôi cũng bối rối bây giờ là lớp phpass (được sử dụng để băm mật khẩu tôi tin) sử dụng bcrypt (tức là blowfish, tức là mã hóa). Dựa trên thông tin mới này, các bạn đang nói với tôi (blowfish là mã hóa), lớp này nghe có vẻ sai. Tui bỏ lỡ điều gì vậy?


2
Điều đó không sai; xem các bản cập nhật cho câu trả lời của tôi để biết giải thích về cách bcrypt hoạt động và lý do tại sao nó phục vụ cùng mục đích như thuật toán "một chiều" dựa trên hàm băm.
erickson

3
bcryptđơn giản là có "hệ số công việc" cao hơn theo mặc định. SHA được cho là không ... trừ khi bạn sử dụng passhash9, có thể sử dụng cùng với một yếu tố công việc. Tại sao câu hỏi này được đóng lại? nó xa trả lời nhưng rất quan trọng.

1
Liên kết trong câu hỏi không hoạt động ...............
Pacerier

Câu trả lời:


320

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.


4
+1 bài đăng tuyệt vời. Nhưng tôi có hai câu hỏi. Blowfish đã được thay thế bởi twofish hơn một thập kỷ trước, không phải là một hệ thống sử dụng nguyên thủy hiện đại? Ngoài ra, hàng ngàn lần lặp lại có vẻ lãng phí trong các hệ thống như ứng dụng web nơi nhiều người đang đăng nhập tại bất kỳ thời điểm nào. Chẳng hạn, PBKDF2 chỉ được triển khai trong các tình huống khi 1 người đang đăng nhập cùng lúc, chẳng hạn như hàm string2key cho hệ thống tệp được mã hóa. Tôi sử dụng câu ngạn ngữ "Nếu nó quá nặng để kẻ tấn công nâng, thì nó quá nặng cho máy chủ của bạn." Bạn nghĩ sao?
rook

17
Tôi không nghĩ có gì sai khi sử dụng nguyên thủy hiện đại hơn. Các lỗ hổng thường được phát hiện theo thời gian và Twofish được phát triển bằng kiến ​​thức thu được từ Blowfish. Tuy nhiên, tôi không nhận thức được các lỗ hổng cụ thể sẽ làm mất hiệu lực sử dụng Blowfish, do đó, một cuộc tranh luận "nếu nó không bị phá vỡ" cũng có thể được đưa ra. Câu ngạn ngữ của bạn về những kẻ tấn công không tốt cho tôi. Ngay cả khi bạn chọn một thuật toán cần nhiều năm để kẻ tấn công kiểm tra một tỷ mật khẩu, nó sẽ tiêu tốn một phần thời gian không đáng kể trong một ứng dụng hợp pháp.
erickson

15
Nếu bạn nhìn vào đặc điểm kỹ thuật của bất kỳ hàm băm nào, bạn sẽ không thấy gì về "muối". Tham số duy nhất là thông điệp được tiêu hóa. Xem lại đặc điểm kỹ thuật của bất kỳ mật mã nào, và bạn sẽ thấy rằng hàm được tham số hóa bằng một khóa. "Muối" có thể (hoặc có thể không ) được sử dụng cùng với hàm băm chỉ đơn giản là một phần của thông điệp. Thuật toán băm không yêu cầu nó, không xử lý nó đặc biệt và không thể phân biệt nó với phần còn lại của tin nhắn. Vì vậy, trong khi sự thật là các thông điệp thường bị thay đổi bằng cách tạo muối, một thông điệp đã cho chỉ tạo ra một hàm băm.
erickson

1
@Andre D Là một pentester tôi báo cáo các ứng dụng khóa tài khoản và tôi Báo cáo các ứng dụng không ngăn chặn được sức mạnh vũ phu. Lý tưởng nhất là một địa chỉ IP vi phạm phải giải một captcha, ngoài ra nếu tên người dùng được nhắm mục tiêu (ngay cả khi tên người dùng đó không tồn tại) thì tài khoản đó sẽ giải quyết một captcha trước khi xác thực. Việc thực hiện một phép tính X mỗi phút cũng được chấp nhận. Liên quan: security.stackexchange.com/questions/25444/
Mạnh

2
@rook: trong khi ứng dụng sơ bộ là thông lệ tốt, bạn có thể cho rằng trong trường hợp này cơ sở dữ liệu đã được tải xuống và đặt trên thiết bị không có giới hạn tốc độ mà bạn mô tả.
Ellert van Koperen

50

Tôi đồng ý với câu trả lời của Erickson, với một caveat: cho các mục đích xác thực mật khẩu, bcrypt là xa tốt hơn so với một lặp đơn của SHA-512 - đơn giản chỉ vì nó là xa chậm hơn. Nếu bạn không hiểu tại sao sự chậm chạp là một lợi thế trong trò chơi cụ thể này, hãy đọc bài viết bạn đã liên kết lại (cuộn xuống " Tốc độ chính xác là những gì bạn không muốn trong hàm băm mật khẩu. ").

Tất nhiên, bạn có thể xây dựng thuật toán băm mật khẩu an toàn xung quanh SHA-512 bằng cách lặp lại hàng nghìn lần, giống như cách thuật toán MD5 của PHK hoạt động. Ulrich Drepper đã làm chính xác điều này , cho tiền điện tử của glibc (). Tuy nhiên, không có lý do cụ thể để làm điều này, nếu bạn đã có sẵn một triển khai bcrypt được thử nghiệm.


3
Hy vọng rằng câu trả lời của tôi cho thấy rõ rằng một lần lặp băm duy nhất là không đủ (đáng buồn thay, ngay cả mức độ kiến ​​thức thô sơ này cũng không thể được giả định). "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, đầ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 đi lặp lại "
erickson

@erickson: Vâng, mặc dù tôi nghĩ rằng bạn có thể đã chôn cái đèn led ở đó. Điểm tôi đang cố gắng đưa ra là so sánh trực tiếp bcrypt và SHA-512 không thực sự phù hợp, bởi vì một cái là một hàm phái sinh chính và cái kia chỉ là một nguyên thủy mã hóa, không phù hợp.
phê


1
Sử dụng hàng ngàn vòng SHA-512 không phải là chưa từng thấy và được đưa vào các crypttriển khai khác nhau (bao gồm cả trong PHP mà tôi sử dụng), khi tôi đọc câu hỏi ban đầu, tôi thậm chí còn cho rằng OP có ý gì khi anh ấy hỏi về SHA-512 - rằng anh ta thực sự đã đề cập đến hàng ngàn vòng SHA-512 so với bcrypt sử dụng hàng trăm hoặc hàng nghìn lần lặp.
thomasrutter

33

Blowfish không phải là một thuật toán băm. Đó là một thuật toán mã hóa. Điều đó có nghĩa là bạn có thể mã hóa thứ gì đó bằng cách sử dụng blowfish, và sau đó bạn có thể giải mã nó trở lại văn bản thuần túy.

SHA512 là một thuật toán băm. Điều đó có nghĩa là (về lý thuyết) một khi bạn băm đầu vào, bạn không thể lấy lại đầu vào ban đầu.

Chúng là 2 thứ khác nhau, được thiết kế để sử dụng cho các nhiệm vụ khác nhau. Không có câu trả lời 'chính xác' cho "liệu cá đòn có tốt hơn SHA512 không?" Bạn cũng có thể hỏi "táo có tốt hơn kanguru không?"

Nếu bạn muốn đọc thêm về chủ đề ở đây, một số liên kết:


18
Tôi nghĩ rằng câu hỏi là về việc sử dụng bcrypt như một sự bảo vệ không thể đảo ngược đối với mật khẩu, giống như băm được sử dụng cho mục đích đó.
erickson

3
@erickson văn bản "Q: nhưng liệu blowfish có tốt hơn SHA512 không?" có vẻ khá rõ ràng đối với tôi và cho thấy OP không hiểu sự khác biệt giữa 2 thuật toán
Glen

1
OP đây. Trên thực tế, dựa trên asnwer của Glen rằng blowfish là một thuật toán mã hóa (mà tôi hiểu là khác với băm), bây giờ tôi nhận ra rằng câu hỏi của tôi có bị nhầm lẫn. Điều khó hiểu bây giờ là lớp phpass (tôi sử dụng để băm mật khẩu tôi tin) sử dụng bcrypt (tức là blowfish, tức là mã hóa). Nếu blowfish là mã hóa, tại sao phpass sử dụng nó để băm mật khẩu, có vẻ như là một lỗ hổng đối với tôi, phải không? Tui bỏ lỡ điều gì vậy?
Chris

2
tuy nhiên câu hỏi yêu cầu táo và kanguru nào phù hợp hơn với một nhiệm vụ cụ thể. Blowfish là một chức năng băm tốt hơn sha vì thời gian để băm. Hầu hết các triển khai của sha tôi đã thấy là rất nhanh. Bạn muốn một thuật toán chậm để băm mật khẩu.
John Nicholas

Câu trả lời này là chính xác rằng Blowfish là một thuật toán mã hóa, nhưng trong bối cảnh này (ví dụ, khi được sử dụng bcrypt), nó được sử dụng như một thuật toán băm bằng cách lấy một khóa từ chuỗi nguồn và sử dụng nó để mã hóa số ma thuật. Điều này làm cho nó không thể đảo ngược, về cơ bản là một chức năng băm. Bạn không thể tính toán khóa từ mật mã, ngay cả khi bạn biết dữ liệu gốc và dữ liệu được mã hóa.
thomasrutter

4

Blowfish không tốt hơn MD5 hoặc SHA512, vì chúng phục vụ các mục đích khác nhau. MD5 và SHA512 là các thuật toán băm, Blowfish là một thuật toán mã hóa. Hai chức năng mã hóa hoàn toàn khác nhau.


2

Tôi muốn giới thiệu triển khai mật mã dựa trên SHA-256 / SHA-512 của Ulrich Drepper.

Chúng tôi đã chuyển các thuật toán này sang Java và bạn có thể tìm thấy một phiên bản được cấp phép tự do của chúng tại ftp://ftp.arlut.utexas.edu/java_hashes/ .

Lưu ý rằng hầu hết các Unice (L) hiện đại đều hỗ trợ thuật toán của Drepper trong các tệp / etc / bóng của họ.


PWDTK sourceforge.net/projects/pwdtknet sử dụng HMAC-SHA512 tuy nhiên, qua nhiều lần lặp lại để tạo ra "sự chậm chạp" hay còn gọi là Kéo dài khóa như những người khác ở đây đã nói. BCrypt tốt hơn một SHA-512 như đã được đề cập, tuy nhiên nếu bạn sử dụng SHA-512 trong một cái gì đó như PBKDF2 thì bạn sẽ an toàn (Miễn là bạn đang sử dụng một loại muối ngẫu nhiên lớn và đủ số lần lặp để buộc thời gian tạo một bảng cầu vồng) API tôi vừa đăng được xây dựng bởi tôi và sẽ làm những gì bạn muốn trong .NET nếu đó là những gì bạn đang phát triển (Vì lợi ích của độc giả trong tương lai)
thashiznets

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.