2013-03-31 29 views
6

Câu hỏi là cùng một tiêu đề, Trường hợp $ 2x $ được sử dụng trong BCrypt?Trường hợp tiền tố 2x được sử dụng trong BCrypt?

Kịch bản sau đây đúng?

Chúng tôi có một bộ mật khẩu được băm với tiền tố $2a$, khi phiên bản Máy chủ PHP trước đó là 5.3.7. Bây giờ, chúng tôi đã nâng cấp PHP lên 5.3.7+, bây giờ trước tiên chúng tôi phải xác minh mật khẩu trước bằng thuật toán $2x$ sau đó khôi phục mật khẩu bằng tiền tố $2y$. Đúng rồi?

+0

Có thể tìm thấy câu trả lời hay trong ** [weblog] (http://daveyshafik.com/archives/35354-the-blowfish-debacle.html) **. nhưng tôi không hiểu những gì nói trong câu này: _Now, mã này giả định rằng bạn phát hiện ra vấn đề trước khi cập nhật máy chủ; nếu bạn đã tạo mật khẩu mới kể từ khi nâng cấp, 'bạn sẽ muốn kiểm tra lại $ băm $ $ nếu kiểm tra $ 2x $ thất bại', và sau đó cập nhật thành' $ 2y $ '._ ** Có nghĩa là, đôi khi mật khẩu được băm với '$ 2a $' trong 'PHP 5.3.7-' sẽ không thể xác minh bằng '$ 2x $' trong 'PHP 5.3.7 +'? ** – msoa

+0

Câu trả lời khác : [Chi tiết sửa lỗi bảo mật CRYPT_BLOWFISH] (http://www.php.net/security/crypt_blowfish.php) ** Kết quả: Theo như tôi hiểu khi chúng tôi có một bộ mật khẩu được băm với '$ 2a $' trên ' PHP 5.3.7-'và muốn cập nhật PHP thành' 5.3.7 + ', chúng ta phải sau khi nâng cấp xác minh mật khẩu cũ với' $ 2x $ '. Vì vậy, chỉ sử dụng '$ 2x $' là giống nhau. ** Nếu ai đó nghĩ rằng tôi đã nhận ra sai lầm, hãy nhận biết tôi. Cảm ơn – msoa

Trả lời

23

Lưu ý tới trình biên tập wikipedia: Nội dung trong câu trả lời này thuộc phạm vi công cộng; tôi biết vì tôi đã viết nó. Tôi đã viết nó đầu tiên cho bản thân mình, và sau đó đặt nó trên Stackoverflow. Tôi cũng biết điều đó bởi vì mọi thứ trên Stackoverflow là copyleft. Và ngay cả khi nó không được, bất cứ ai được tự do sử dụng nó bất cứ nơi nào, bất cứ lúc nào, vì lý do nào, bởi bất cứ ai. Làm sao tôi biết? Bởi vì tôi đã viết nó và tôi chỉ nói vậy. Điều đó bao gồm mục nhập Bcrypt trên Wikipedia. Theo cách nói Wikipedia: tôi tặng nó.

Vì vậy, hãy ngừng khiếu nại vi phạm bản quyền khi bạn không biết mình đang nói về điều gì.

bcrypt biến thể

$ 2 $

bcrypt được thiết kế bởi những người OpenBSD. Nó được thiết kế để băm mật khẩu để lưu trữ trong tệp mật khẩu OpenBSD. Mật khẩu được lưu trữ được lưu trữ với tiền tố để xác định thuật toán được sử dụng. BCrypt có tiền tố $2$.

Đây là trái ngược với các tiền tố thuật toán khác:

  • $1$: MD5
  • $5$: SHA-256
  • $6$: SHA-512

$ 2a $

Đặc tả BCrypt gốc không xác định cách xử lý các ký tự không phải ASCII, hoặc cách xử lý một terminator null. Các đặc điểm kỹ thuật đã được sửa đổi để xác định rằng khi băm chuỗi:

  • chuỗi phải UTF-8 mã hóa
  • terminator rỗng phải được bao gồm

$ 2x $, $ 2y $(Tháng 6 năm 2011)

Lỗi được phát hiện trong crypt_blowfish, triển khai PHP của BCrypt. Đó là các ký tự xử lý sai với tập bit thứ 8.

Họ đề nghị quản trị viên hệ thống cập nhật cơ sở dữ liệu mật khẩu hiện có của họ, thay thế $2a$ bằng $2x$, để cho biết rằng các băm đó là xấu (và cần sử dụng thuật toán bị hỏng cũ).Họ cũng đề xuất ý tưởng có crypt_blowfish phát ra $2y$ cho các băm được tạo bởi thuật toán cố định. Không ai khác, bao gồm cả OpenBSD kinh điển, đã thông qua ý tưởng của 2x/2y. This version marker was was limited to crypt_blowfish.

Các phiên bản $ 2x $$ 2y $ không phải là "tốt" hay "mạnh" hơn $ 2a $. Chúng là tàn dư của một lỗi cụ thể của BCrypt.

$ 2b $(tháng 2 năm 2014)

Một lỗi đã được phát hiện trong việc thực hiện OpenBSD của bcrypt. Họ đã lưu trữ chiều dài của chuỗi của họ trong một unsigned char. Nếu mật khẩu dài hơn 255 ký tự, mật khẩu sẽ tràn và quấn tại 255.

BCrypt được tạo cho OpenBSD. Khi họ gặp lỗi trong số thư viện của họ, họ đã quyết định chấp nhận phiên bản đó. Điều này có nghĩa là mọi người khác cần theo dõi nếu bạn muốn giữ nguyên thông số "của họ".

Phiên bản $ 2b $ không phải là "tốt" hay "mạnh" hơn $ 2a $. Nó là một phần còn lại của một thực thi buggy cụ thể của BCrypt. Nhưng kể từ khi BCrypt về mặt kinh điển thuộc về OpenBSD, họ có thể thay đổi điểm đánh dấu phiên bản thành bất kỳ thứ gì họ muốn.

Không có sự khác biệt giữa 2a, 2x, 2y, và 2b. Nếu bạn đã viết bản triển khai của mình một cách chính xác, tất cả chúng đều xuất kết quả tương tự.

Và nếu bạn đang làm điều đúng đắn ngay từ đầu (lưu trữ chuỗi trong utf8 và cũng băm terminator null) thì: không có sự khác biệt giữa , 2a, 2x, 2y, và 2b. Nếu bạn đã viết bản triển khai của mình một cách chính xác, tất cả chúng đều xuất kết quả tương tự.

Những người duy nhất cần quan tâm đến 2x và 2y là những người bạn có thể đã sử dụng crypt_blowfish. Và những người duy nhất cần quan tâm đến 2b là những người có thể đang chạy OpenBSD.

Tất cả các cách triển khai chính xác khác đều giống hệt nhau và chính xác.

+2

Rất cảm ơn người bạn của tôi. – msoa