2012-06-24 42 views
8

im làm việc với đường ray và tôi nhận thấy rằng mật khẩu của tôi là khác nhau cho 2 người dùng với tất cả các trường khác ngoài mật khẩu tiêu hóa khác nhau. nhưng tôi đã sử dụng cùng một mật khẩu "abcd" cho cả hai ..
nó đã kết thúc việc tạo ra những 2 khác nhau bămTại sao mật khẩu băm khác nhau cho 2 người dùng có cùng mật khẩu?

  1. $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
  2. $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem

tôi nghĩ viên ngọc bcrypt tạo ra băm chỉ dựa trên trường mật khẩu! Liệu tôi có sai? cảm ơn :)

+0

Có lẽ (hy vọng) mật khẩu được [muối] (http://en.wikipedia.org/wiki/Salt_ (mật mã))? –

+0

[Salting!] (Http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –

+0

Hành vi này là _emphatically_ theo thiết kế. – SLaks

Trả lời

16

Điều bạn đang xem ở đây không chỉ là băm mật khẩu, có rất nhiều siêu dữ liệu về băm được bao gồm trong các chuỗi đó. Về bcrypt, toàn bộ chuỗi sẽ được coi là bcrypt băm. Dưới đây là những gì nó bao gồm:

$ là dấu tách trong bcrypt.

$ 2a $ là thuật toán bcrypt được sử dụng.

$ $ là hệ số chi phí đã được sử dụng. Đây là lý do tại sao bcrypt là rất phổ biến để lưu trữ băm. Mỗi băm có một sự phức tạp/chi phí liên quan đến nó, mà bạn có thể nghĩ đến việc phải mất bao lâu một máy tính để tạo ra băm này. Con số này tất nhiên là tương đối so với tốc độ của máy tính, vì vậy khi máy tính hoạt động nhanh hơn và nhanh hơn trong những năm tới, sẽ tốn ít thời gian hơn để tạo ra băm với chi phí là 10. Vì vậy, năm sau bạn tăng chi phí lên 11, sau đó đến 12 ... 13 ... v.v. Điều này cho phép băm tương lai của bạn vẫn mạnh mẽ trong khi vẫn giữ các băm cũ của bạn vẫn hợp lệ. Chỉ cần lưu ý rằng bạn không thể thay đổi chi phí của một băm mà không cần phục hồi chuỗi gốc.

$ QyrjMQf ... là sự kết hợp giữa muối và hàm băm. Đây là chuỗi được mã hóa base64.

22 ký tự đầu tiên là muối.

Các ký tự còn lại là băm khi được sử dụng với thuật toán 2a, chi phí là 10 và muối đã cho. Lý do cho muối là như vậy một kẻ tấn công không thể tính toán băm bcrypt trước để tránh phải trả chi phí tạo ra chúng.

Thực tế đây là câu trả lời cho câu hỏi ban đầu của bạn: Lý do băm là khác nhau bởi vì nếu chúng giống nhau bạn sẽ biết rằng bất cứ lúc nào bạn nhìn thấy chuỗi bcrypt $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO bạn sẽ biết mật khẩu là abcd. Vì vậy, bạn chỉ có thể quét một cơ sở dữ liệu của băm và nhanh chóng tìm thấy tất cả người dùng với mật khẩu abcd bằng cách tìm kiếm băm đó.

Bạn không thể làm điều này với bcrypt vì $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem cũng là abcd. Và có rất nhiều nhiều băm nữa sẽ là kết quả của bcrypt('abcd'). Điều này làm cho việc quét một cơ sở dữ liệu cho mật khẩu abcd bên cạnh không thể.

+1

cảm ơn bạn! :) Điều đó thực sự hữu ích và nhiều hơn những gì tôi mong đợi! – viswa

2

bcrypt lưu trữ muối trong mật khẩu băm.

Đó là hai hàm băm khác nhau của cùng một mật khẩu với hai loại muối khác nhau.

Khi xác minh mật khẩu, bcrypt sẽ đọc muối từ trường băm, sau đó tính lại hàm băm bằng muối đó.

Các vấn đề liên quan