2013-05-23 17 views
5

Tôi đã đọc rất nhiều ở đây và các địa điểm khác về việc sử dụng cookie cho tùy chọn "nhớ tôi", nhưng những gì tôi đang tìm kiếm là một cách thiết kế một cookie để ghi lại thành công của xác thực hai yếu tố. Ví dụ: Google thực hiện: Nếu bước thứ hai thành công (ví dụ: bạn đã nhập mã mà bạn nhận được qua SMS), thì nó sẽ đặt cookie tốt trong một khoảng thời gian (ví dụ: 30 ngày) có nghĩa là bước thứ hai có thể được bỏ qua. Gọi đây là "cookie xác minh". Sự hiểu biết của tôi là nếu trong thời gian đó bạn đăng xuất và sau đó một lần nữa, nó sẽ không làm bước thứ hai, nhưng chỉ là bước đầu tiên. (Tôi đã thử nghiệm điều này và dường như là như vậy.)Cần cookie để nhớ thành công xác thực hai yếu tố (không phải đăng nhập liên tục)

Câu hỏi của tôi là cách thiết kế cookie này. Một ý tưởng là đặt ID người dùng và số ngẫu nhiên 128 bit vào cookie, sau đó lưu trữ số đó trong cơ sở dữ liệu cùng với ID người dùng. Đây là những gì Charles Miller đề xuất (http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/) cho cookie đăng nhập liên tục.

Tuy nhiên, điều đó không đủ tốt, tôi nghĩ vậy. Vấn đề là, vì người dùng đang sử dụng ủy quyền hai yếu tố, bất kỳ cookie nào được sử dụng để ghi lại rằng bước thứ hai đã thành công, nên an toàn hơn trường hợp có ủy quyền một yếu tố.

Điều tôi muốn tránh là: Trình bẻ khóa có mật khẩu băm/muối từ cơ sở dữ liệu và bằng cách nào đó đã nhận được mật khẩu. Nếu anh ta/cô ấy có nhiều, tôi giả định rằng số ngẫu nhiên 128 bit trong cookie xác minh cũng có sẵn. (Nếu cracker đã nhận được mật khẩu theo cách khác, và không có cơ sở dữ liệu, thì cookie xác minh là an toàn trừ khi người đó có quyền truy cập vật lý vào máy tính. Tôi chỉ lo lắng về trường hợp cơ sở dữ liệu bị xâm nhập.)

Có thể một ý tưởng là mã hóa số ngẫu nhiên 128 bit? (Cần phải là 2 chiều - không phải là băm.) Khóa mã hóa sẽ có thể truy cập được vào ứng dụng, có thể được lưu trữ tuy nhiên các thông tin cơ sở dữ liệu là.

Có ai đã triển khai những gì tôi gọi là cookie xác minh không (không cookie đăng nhập liên tục) và có thể cho tôi biết (chúng tôi) cách thực hiện?


UPDATE: Suy nghĩ về vấn đề này, những gì tôi sẽ nghĩ là đủ an toàn sẽ là: Cookie gồm userID và 128-bit số ngẫu nhiên - gọi nó là R.

Cơ sở dữ liệu chứa mật khẩu và R, mỗi băm và muối (ví dụ, sử dụng PhPass). R sau đó được coi là một mật khẩu thứ hai. Lợi ích: Ngay cả khi mật khẩu đầu tiên là xấu (ví dụ: "password1"), R là một mật khẩu rất tốt. Cơ sở dữ liệu thực sự không thể bị nứt, vì vậy nó không phải là một lo lắng. (Tôi đã không cần thiết lo lắng về điều đó, tôi nghĩ vậy.)

+0

tôi đã thêm một cách để khóa chặt các cookie cho trình duyệt: Trước khi băm, tôi kết nối những gì tôi gọi R với tác nhân người dùng + một số thuộc tính màn hình (DPI, chiều rộng, chiều cao, v.v ...). Tất nhiên, không có thuộc tính được nối nào được lưu trữ trong cookie, chỉ R là. Vì vậy, nếu cracker được R, anh/cô ấy sẽ phải chạy từ trình duyệt trên một máy tính với các thuộc tính tương tự. Không hoàn hảo, nhưng làm cho dữ liệu của cookie khó hơn nhiều. Tôi nghĩ rằng cách tiếp cận của tôi là tốt hơn so với những gì nhiều người làm, với là băm với IP. IP thay đổi thường xuyên hơn nhiều so với phiên bản trình duyệt hoặc màn hình máy tính. –

Trả lời

1

Tôi nghĩ rằng bạn có một kế hoạch khá tốt ở đây. Nói chung, cookie phải hoàn toàn ngẫu nhiên và không được chứa bất kỳ dữ liệu nào được máy chủ sử dụng. Ý tưởng là bất kỳ thứ gì được kiểm soát bởi khách hàng đều có thể bị giả mạo. Ngay cả khi giá trị được mã hóa, tôi đã nhìn thấy kẻ tấn công twiddle bit và nhận được các dữ liệu giả mạo để giải mã cho một ID người dùng khác nhau (yeah rằng một trong những sợ tôi một chút). Điều đó đang được nói rằng tôi nghĩ rằng gợi ý của Charlie Miller là tốt, bởi vì 128-bit là một số lượng tốt của entropy. Cá nhân tôi, tôi sẽ đi với các byte hoàn toàn ngẫu nhiên cho một cookie như vậy mà không có mô hình xuất hiện bất cứ điều gì.

Việc triển khai cookie xác minh cuối cùng của chúng tôi là giá trị 256 bit hoàn toàn ngẫu nhiên được in bằng ascii-hex được ánh xạ tới ID người dùng và thông tin phiên trong DB của chúng tôi. Chúng tôi giữ thông tin phiên được mã hóa bằng khóa bí mật, vì vậy nếu một kẻ tấn công SQL tiêm DB của chúng tôi thì tất cả sẽ là thông tin mã hóa vô dụng. Tất nhiên, một sự thỏa hiệp hoàn toàn của máy DB sẽ cung cấp quyền truy cập vào khóa, nhưng đó là rất nhiều khó khăn hơn để làm bởi vì nó liên quan đến nhiều khai thác và pivots.

Một số lời khuyên tốt là không quá suy nghĩ quá nhiều. Chúng tôi gặp phải các vấn đề về triển khai vì chúng tôi "đã thiết kế quá mức" và cuối cùng, chúng tôi đã không nhận được nhiều lợi thế về bảo mật. Một số ngẫu nhiên đơn giản là tốt nhất bạn có thể làm (miễn là nó đủ dài để cung cấp đủ entropy).

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