Cách thực hiện an toàn đăng nhập tự động


15

Tôi đã đọc rất nhiều, rất nhiều bài viết về cách "bạn có thể lưu trữ sai mật khẩu". Họ luôn đề cập đến việc lưu trữ mật khẩu trên một máy chủ mà người dùng đang đăng nhập; về cơ bản họ đã thử lại (những ý định chơi chữ) phổ biến như đảm bảo muối mật khẩu, v.v. Tuy nhiên, tôi chưa bao giờ thấy một bài viết về thực hành tốt nhất để lưu trữ mật khẩu trên máy khách để khách hàng không phải đăng nhập thủ công mỗi khi họ muốn đăng nhập; tính năng "nhớ tôi".

Nhiều phần mềm có tính năng này, từ trình duyệt đến các chương trình như Dropbox.

Gần đây tôi đã đọc một bài viết cũ về cách Dropbox lưu trữ ID trên máy tính của bạn để bạn có thể sao chép / dán vào máy tính khác và khởi động Dropbox và đăng nhập như thiết bị bạn nhận được ID từ đó; không đăng nhập, không có gì và truy cập đầy đủ vào tài khoản Dropbox. Đây có vẻ là một thiết kế thực sự ngu ngốc, nhưng tôi không thể nghĩ ra cách nào tốt hơn để làm nó.

Tôi thậm chí không chắc chắn làm thế nào để tránh lưu trữ một cái gì đó như cookie trong văn bản đơn giản. Nếu bạn mã hóa nó, bạn sẽ lưu trữ khóa ở đâu để giải mã nó?

Cách duy nhất tôi thấy để không giới thiệu các lỗ hổng bảo mật là xóa tính năng autologin và khiến người dùng nhập mật khẩu của họ mỗi khi họ muốn sử dụng dịch vụ, nhưng đó là một cuộc đấu tranh về khả năng sử dụng và người dùng tha hồ không phải làm điều đó.

Tôi có thể đọc gì về thông tin lưu trữ cục bộ một cách an toàn để thực hiện tính năng đăng nhập tự động? Nếu các nguyên tắc quá đơn giản cho toàn bộ một bài viết, chúng là gì? Phần mềm được đề cập không nên phụ thuộc vào các tính năng không có trên tất cả các nền tảng (như "móc khóa" mà một số bản phân phối linux có).


2
Đó là về những gì bạn tin tưởng. Nếu bạn không tin tưởng máy lưu trữ ID thì đó là vấn đề của bạn. Nếu bạn tin tưởng vào móc khóa thì đó là bảo mật tối đa bạn sẽ nhận được. Dĩ nhiên, bạn có thể thêm một số an toàn tùy chỉnh như phát hiện phần cứng thiết bị hoặc thứ gì đó nhưng tất cả đều có thể giả mạo để cuối cùng bạn không thể biết. Nó nằm ngoài tầm kiểm soát của bạn. Tất nhiên những điều ngu ngốc như lưu mật khẩu văn bản rõ ràng loại trừ.
Luc Franken

@LucFranken làm sao bạn có thể tin tưởng vào máy? Ai đó có thể khai thác bạn như họ đã làm dropbox. Ngoài ra tôi sẽ tin tưởng vào móc khóa nhưng không phải tất cả các máy tính đều có một và Windows không bao giờ làm như vậy (AFAIK). Và nếu bạn đang lưu trữ mật khẩu, làm thế nào để bạn tránh lưu trữ chúng ở dạng văn bản rõ ràng? Nếu bạn mã hóa chúng thì bạn sẽ lưu trữ khóa ở đâu để giải mã nó?
Jay Simon

Đó chính xác là vấn đề, bạn không thể tin tưởng nó. Người dùng chỉ có thể xác định để tin tưởng nó. Điều đó sẽ được xem xét người dùng hiểu mức độ an toàn của máy tính của mình. Viết một virus nhận dữ liệu từ Dropboxes là có thể. Tương tự với các khóa được lưu trữ cục bộ và dữ liệu cục bộ khác. Bạn có thể giúp làm cho nó an toàn hơn (nghĩ về các ứng dụng yêu cầu mã 5 số) nhưng cuối cùng, nó nằm trong tầm kiểm soát của bạn.
Luc Franken

@LucFranken chỉ là tôi hay autologin có vẻ như là một tính năng phổ biến? Nếu có, tại sao mọi người không viết về cách làm đúng?
Jay Simon

Đó là một yêu cầu rất phổ biến mặc dù một số phần mềm doanh nghiệp không cho phép nó. Ví dụ SalesForce chỉ cho phép lưu tên người dùng, không phải mật khẩu. Hãy đặt btw rõ ràng. rằng bạn không phải lưu trữ mật khẩu tại máy khách để đăng nhập. Bạn có thể lưu trữ một hàm băm ngẫu nhiên tương ứng với hàm băm trên máy chủ.
Luc Franken

Câu trả lời:


12

Một cách là:

  • Khi người dùng đăng nhập, lưu trữ ID phiên trong cookie trên máy tính của khách hàng (không phải tên người dùng hoặc mật khẩu).
  • Liên kết phiên với địa chỉ IP, do đó ID phiên cá nhân chỉ hoạt động với máy tính được khởi động.

Tùy thuộc vào khuôn khổ nào bạn đang sử dụng để phát triển trang web của mình, hành vi này có thể có sẵn dưới dạng một tính năng tích hợp.

Lưu ý rằng, vì dù sao giao thức HTTP là không trạng thái, nên thực sự không có sự khác biệt về chức năng giữa việc giữ ai đó đăng nhập trong một phiên sử dụng trang web và "đăng nhập tự động" vào lần tiếp theo họ sử dụng trang web; vấn đề chỉ là bạn cho phép bao nhiêu thời gian trước khi phiên hết hạn.

Cập nhật: Ngoài ra, sử dụng HTTPS để tăng tính bảo mật, rõ ràng.

Cập nhật 2: Lưu ý rằng phương pháp này có những hạn chế, ở chỗ nó không hoạt động tốt đối với người dùng thay đổi địa chỉ IP nhiều. Tuy nhiên, nó cung cấp một mức độ bảo mật tăng lên và có thể hữu ích trong một số tình huống.


1
Việc nhập nó vào một địa chỉ IP không giúp được gì nhiều vì ai đó có thể có một máy tính đằng sau cùng một tường lửa như bạn.
Jay Simon

2
@JaySimon, tôi sẽ không nói "không giúp được gì nhiều". Số lượng máy tính đằng sau cùng một tường lửa như bạn nhỏ hơn rất nhiều so với số lượng máy tính trên thế giới. Đó là về việc hạn chế khả năng bị tấn công của bạn và điều này hạn chế rất nhiều. Đây là một cách tiếp cận tiêu chuẩn và tôi thực sự không nghĩ rằng bạn có thể làm được gì nhiều ngoài nó. Nếu ai đó có cùng địa chỉ IP với người dùng quản lý để có được ID phiên, người đó sẽ không thể phân biệt được với người dùng theo quan điểm của máy chủ. Nếu bạn có bất kỳ loại đăng nhập nào trên trang web của mình, bạn sẽ gặp phải một cuộc tấn công như vậy.

3
Bạn có nghĩ rằng cách tiếp cận như vậy sẽ gây khó chịu cho người dùng trên điện thoại di động, địa chỉ IP có thể thay đổi thường xuyên không?
Jay Simon

@JaySimon, nếu nó xảy ra trong một phiên, người dùng sẽ trải nghiệm nó như một lần đăng xuất bất ngờ, điều này chắc chắn sẽ gây khó chịu. Tuy nhiên, tôi không biết họ thực sự thay đổi như thế nào (một tìm kiếm nhanh trên Google không tiết lộ câu trả lời dứt khoát). Tôi sẽ không quá lo lắng về điều đó trừ khi IP có thể thay đổi trong khi họ thực sự sử dụng nó.

Hạn chế phiên đối với IP không thực sự như đã nói. Người dùng thay đổi vị trí thường xuyên. Với điện thoại di động mà còn với máy tính xách tay; ví dụ flex làm việc. Điều tốt nhất bạn có thể làm là có một số kiểm tra GeoIP kết hợp với thời gian để di chuyển quãng đường đó; giống như Gmail.
Lode

5

Amazon (và nhiều người khác) sử dụng phương pháp lai. Họ cung cấp autologin để duyệt, thêm các mặt hàng vào giỏ hàng và đặt hàng bằng cách sử dụng kết hợp địa chỉ giao hàng / tín dụng bạn đã sử dụng trước đây. Tuy nhiên, họ yêu cầu bạn nhập mật khẩu cho nhiều hành động như thêm thẻ tín dụng, thêm / thay đổi địa chỉ giao hàng, cập nhật mật khẩu, xem các đơn đặt hàng trước đây (tùy chọn cho người dùng) và nhiều cài đặt tài khoản khác.

Vì vậy, vâng, những người có quyền truy cập vào máy tính của bạn có thể chiếm quyền điều khiển phiên của bạn, nhưng bạn vẫn nhận được những gì họ đặt hàng! (Quan trọng hơn, việc khuyến khích chiếm quyền điều khiển phiên bị phủ nhận khá nhiều.) Nhưng nếu ai đó có quyền truy cập vào máy tính của tôi, tôi gặp vấn đề lớn hơn so với việc mọi người ăn cắp các phiên của trang trung bình.

Nếu bạn có các phần trong ứng dụng của mình không cần bảo mật cao, bạn có thể chọn mô hình kết hợp nơi bạn lưu trữ ID phiên (băm hoặc bất cứ điều gì nếu bạn muốn) để tự động đăng nhập người dùng vào các phần bảo mật thấp của trang web , nhưng yêu cầu họ nhập mật khẩu khi nhập các khu vực bảo mật cao hơn và xóa mã thông báo bảo mật cao khi phiên kết thúc.

Tất nhiên, nếu đây là một trang web cấp ngân hàng, thì đăng nhập tự động không phải là một tùy chọn. Một lần nữa, các trang web sử dụng các loại bảo mật này giả định giá trị của dữ liệu họ đang bảo vệ và sự tiện lợi được thêm vào cho người dùng cân nhắc nguy cơ tiềm ẩn của phiên bị tấn công. Nếu bạn cảm thấy đó không phải là trường hợp cho ứng dụng của mình, thì đừng thực hiện đăng nhập tự động. Bạn cần truy cập mức độ đánh đổi bảo mật / khả năng sử dụng phù hợp với trường hợp sử dụng của bạn.


2

Nó thực sự không khó lắm. Đầu tiên lưu trữ một cookie với định dạng này:

userID.token

Bạn có thể sử dụng hàm băm sha1 cho mã thông báo. Sau đó, trong bảng cơ sở dữ liệu memory_me_tokens của bạn lưu trữ userID, hàm bcrypt của mã thông báo và thời gian mã thông báo được tạo.

Sau đó, khi ai đó truy cập trang web của bạn, hãy kiểm tra xem liệu cookie đã được đặt chưa. Nếu cookie được đặt thì hãy xem liệu có một hàng hợp lệ cho nó trong cơ sở dữ liệu trong vòng 7 ngày qua không. Nếu có một hàng hợp lệ trong cơ sở dữ liệu cho cookie thì hãy đặt phiên để cho biết rằng người dùng đã đăng nhập và cũng xóa hàng cookie / cơ sở dữ liệu phù hợp và tạo một hàng cookie / mã thông báo / cơ sở dữ liệu mới.

Nếu họ đăng xuất thì xóa cookie.

Chạy một công việc định kỳ để cắt tỉa ghi nhớ_me_tokens cũ hơn 7 ngày.


Điều gì ngăn ai đó sao chép khóa này và dán vào máy của họ và truy cập vào tài khoản mà không cần tên người dùng hoặc mật khẩu?
Jay Simon

Làm thế nào bạn sẽ nhận được chìa khóa? nó được lưu trữ cục bộ trên máy tính của ai đó.
Ryan

bạn đi đến máy tính và mở tập tin nơi nó được lưu trữ :)
Jay Simon

2
@JaySimon Lập luận tương tự này có thể được đưa ra cho ai đó đăng nhập và bỏ đi trong 5 phút mà không khóa máy tính của họ hoặc nhấp vào Ghi nhớ tôi và ai đó nhảy vào mật khẩu tài khoản của họ. Nếu bạn có thể chấp nhận tình huống bảo mật có thể này thì sự tiện lợi của nó là tốt nhưng đó là lý do tại sao bạn không thấy tính năng Ghi nhớ trong danh sách CIA NOC :) Máy chủ phải cung cấp cho bạn một số loại mã thông báo mà khách hàng phải lưu trữ trên hệ thống tập tin. Nó không còn nằm trong tay bạn từ góc độ máy chủ nữa.
maple_shaft

@maple_shaft tại sao mọi người ngạc nhiên rằng bạn có thể làm điều đó với dropbox sau đó? (Tôi đã liên kết nó trong câu hỏi của mình.)
Jay Simon

0

Bạn chỉ có thể tin tưởng vào thiết bị nơi bạn lưu trữ. Tùy thuộc vào người dùng (nếu bạn không thể ảnh hưởng đến thiết bị) mức độ an toàn của thiết bị. Nó chỉ đơn giản là ra khỏi tay của bạn.

Như đã nêu trong các ý kiến:

Đó là về những gì bạn tin tưởng. Nếu bạn không tin tưởng máy lưu trữ ID thì đó là vấn đề của bạn. Nếu bạn tin tưởng vào móc khóa thì đó là sự bảo mật tối đa bạn sẽ nhận được. Dĩ nhiên, bạn có thể thêm một số an toàn tùy chỉnh như phát hiện phần cứng thiết bị hoặc thứ gì đó nhưng tất cả đều có thể giả mạo để cuối cùng bạn không thể biết. Nó nằm ngoài tầm kiểm soát của bạn.

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.