2013-08-31 34 views
10

Tôi đã viết một máy chủ web nhỏ hiện đang sử dụng auth cơ bản trên ssl. Cho đến nay tất cả mọi thứ hoạt động tuyệt vời. Bây giờ tôi muốn (cần) để chuyển sang tiêu hóa auth. Nhưng tôi không thể tìm ra cách để thực hiện công việc này với mật khẩu không được lưu trữ dưới dạng văn bản rõ ràng trong cơ sở dữ liệu? Tôi chỉ có mật khẩu thông báo (được tạo bằng bcrypt) mật khẩu của người dùng được lưu trữ. Http có thể xác thực tiêu hóa được không?Mật khẩu được mã hóa trong cơ sở dữ liệu và trình duyệt thông báo auth

Trả lời

11

Chỉ cần xem xét điều này ngay bây giờ. Đầu tiên, tôi đọc qua RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication để có được một số thông tin chi tiết về đặc điểm kỹ thuật và xem cách nó có thể được điều chỉnh để xác thực REST API.

Chuyển sang cùng một câu hỏi như bạn đã làm— Xác thực phân tích có nghĩa là máy chủ cần lưu trữ mật khẩu của người dùng trong văn bản thuần túy không?

This Stack Overflow câu trả lời làm cho nó rõ ràng: số Máy chủ không lưu trữ các mật khẩu chữ thô-it should store the hash of (username|realm|password).

Điều đó sẽ ổn thôi trừ một điều — thông số kỹ thuật chuẩn chỉ hỗ trợ sử dụng MD5 làm hàm băm.

Tất nhiên bạn có thể lưu trữ cả các bcrypt băm băm MD5 nhưng làm như vậy chỉ làm suy yếu an ninh của băm bcrypt render một cách hiệu quả nó vô dụng (kể từ khi kẻ tấn công có thể thay đổi những nỗ lực của mình vào brute buộc băm MD5 thay thế).


Vì vậy, tôi lùi lại một bước và nghĩ rằng, tại sao không bỏ qua spec và sử dụng bcrypt trên cả bên là hàm băm (bcrypt(username|realm|password))?

Vâng, ngoài mục đích chậm, bcrypt has a maximum password lengthmakes it unsuitable for use as a general digest algorithm.


Whew, bây giờ đầu của tôi đang bơi nhưng tôi vẫn nghĩ sẽ cho nó một bước nữa. Một số gợi ý là sử dụng TLS với SRP hoặc mã hóa đã được xác thực, đặc biệt là EAX, nhưng tôi cảm thấy rằng có thể những thứ đó đang thực hiện một bước quá xa đối với một dịch vụ Web đơn giản.

Để đơn giản, nếu bạn thực sự muốn thực hiện việc này, bạn có thể work around bcrypt's character limitation by using a preliminary hash.


câu chuyện dài ngắn có vẻ như bạn có thể làm:

bcrypt(sha256(username|realm|password)) 

Và sử dụng ở vị trí của H(A1) trong một phiên bản bastardized của spec.

Câu hỏi bây giờ trở thành — là tất cả những điều phức tạp hơn đó thực sự đáng giá? Chúng tôi có nhận được bất kỳ lớp bảo mật bổ sung nào trên Xác thực cơ bản qua HTTPS không?

+0

Lâu sau sự kiện tôi biết, nhưng làm rõ tuyệt vời - Tôi thường tránh làm cho lời cảm ơn "cảm ơn", nhưng điều này thực sự đã giúp tôi hiểu được những hạn chế của auth tiêu hóa :) – ChrisV

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