2009-01-19 11 views
11

Tôi muốn triển khai một cơ chế hiệu quả để tăng tốc độ đăng nhập vào ứng dụng web Java của mình, để ngăn chặn các cuộc tấn công bạo lực trên tài khoản người dùng.Làm cách nào để tăng tốc độ đăng nhập trong ứng dụng web Java?

Jeff explained the why, but not the how.

Simon Willison cho thấy một implementation in Python for Django: Điều đó không thực sự giúp tôi cùng như tôi không thể sử dụng memcached hay Django.

Chuyển ý tưởng của mình từ đầu không có vẻ như tuyệt vời - tôi không muốn phát minh lại bánh xe.

Tôi tìm thấy một Java implementation, mặc dù nó có vẻ khá ngây thơ: Thay vì bộ nhớ cache LRU, nó chỉ xóa tất cả các mục sau 15 phút.

EHCache có thể là một thay thế cho memcached, nhưng tôi không có bất kỳ kinh nghiệm với nó và không thực sự muốn intoduce nào công nghệ khác nếu có lựa chọn thay thế tốt hơn cho nhiệm vụ này.

Vì vậy, cách tốt nhất để thực hiện điều chỉnh đăng nhập bằng Java là gì?

Trả lời

1

Tôi vừa hoàn thành khóa bảo mật web do bảo mật khía cạnh và một trong những đề xuất xuất phát từ đó là chỉ bao gồm độ trễ tự nhiên trong mọi nỗ lực đăng nhập - lý thuyết là 1 hoặc 2 giây sự chậm trễ không là gì đối với người dùng thực nhưng sẽ cản trở nghiêm trọng các cuộc tấn công bạo lực.

+0

Bất kỳ đăng nhập nào cũng có thể giết trải nghiệm người dùng. – Loki

+0

Bất kỳ đăng nhập thất bại nào là tiêu chuẩn trong thế giới Unix, nhưng phần ứng dụng web ngụ ý rằng kẻ tấn công có thể làm điều đó trong nhiều chủ đề để hết thời gian chờ đơn giản, bạn phải lưu trữ đăng nhập ở đâu đó và thực hiện một số mã để truy cập và xác minh nó. – Loki

+0

Chỉ trì hoãn tất cả các giao diện không ngăn ai đó chạy đồng thời 50 yêu cầu. Đó là lý do tại sao Simon Willison lưu trữ địa chỉ IP cùng với dấu thời gian trong bộ nhớ cache. –

7

Tôi nghĩ rằng ngay cả EHCache cũng đang giết chết một quả bom bằng bom napalm. Vấn đề là đơn giản và như vậy là việc thực hiện.

Tôi khuyên bạn nên sử dụng bộ lọc servlet ở mức cao nhất để có thể xử lý ít nhất có thể.

Tạo một lớp để lưu trữ như sau:

  • Số nỗ lực (count)
  • Thời gian

Bây giờ, mã này là đơn giản trong một khối sunchronized:

if userid not in attemptMap: 
    attemptMap.add (userid, new attemptItem (userid, 1, now)) 
else 
    tmp = attemptMap.get (userid) 
    if (acquire lock for tmp) : 
     if tmp.time + 30 > now : 
      tmp.count = 0 
      tmp.time = now 
     tmp.count++ 
     if tmp.count > 3 : 
      error=true 
     release lock for tmp 
    else : error=true 

thats it man (miễn là mã được đồng bộ hóa).

+0

Tôi đã yêu cầu một giải pháp trong Java, điều này rõ ràng không phải là Java. Ngoài ra, hãy xem xét nhận xét của riêng bạn: Tôi đang tìm một giải pháp chắc chắn và được kiểm tra kỹ lưỡng, không phải thứ gì đó được ném cùng nhau trong năm phút. Một hệ thống điều chỉnh mà deadlocks sau một vài giờ hoặc một cái gì đó không phải là rất hữu ích. –

+0

Điều tôi nói với bạn là không có thư viện nào thực hiện trực tiếp. Tất cả bạn cần là một cách đồng bộ để đưa dữ liệu (người dùng, số lượng và thời gian hoặc chỉ người dùng và thời gian) và xác minh nó. Nhiều thư viện cung cấp bộ nhớ được đồng bộ hóa, tùy thuộc vào bạn để thích ứng với nó. Tôi đang cung cấp giàn giáo của một giải pháp. – Loki

+0

Bản đồ hoặc vector được đồng bộ hóa đơn giản phải thực hiện. Bạn không cần hệ thống như ehCache chỉ vì điều đó. – Loki

0

Tôi đã sử dụng trường Số lần thử đăng nhập với chi tiết người dùng. Khi đến 50, mật khẩu chính xác bị từ chối và người dùng phải thực hiện đặt lại mật khẩu.

+1

Âm thanh như một cách dễ dàng để DoS một số người dùng nhất định. –

+1

Như sẽ có bất kỳ hình thức chậm trễ theo hàm mũ nào. Quan trọng hơn, khi thời gian trôi qua trở nên dễ dàng hơn và dễ dàng hơn đối với người dùng DOS (vì mỗi lần cố ý bổ sung không hoạt động gấp đôi lần cuối cùng) – SCdF

0

Điều gì về sự gia tăng theo hàm mũ giữa thời gian đăng nhập?

1

Một mà chưa được đề cập là làm cho họ trả lời câu hỏi quên mật khẩu (s) sau rất nhiều nỗ lực xấu + nhập mật khẩu của họ

0

EHCache là khá tốt, và quan trọng hơn Không Written By You, vì vậy bạn don không phải reimplement các tính năng và có thể làm cho họ sai.

Giải pháp của tôi sẽ liên quan đến EHCache hoặc đơn giản hơn (nếu đó là một ứng dụng nhỏ và tôi thực sự không quan tâm đến hiệu năng đồng thời) trong mã đăng nhập.

Bạn sẽ lưu trữ, trên mỗi IP, số lượng lỗi và dấu thời gian.

  • Mỗi lần bạn cố gắng đăng nhập, hãy tập luyện xem họ có được phép sử dụng số không và dấu thời gian không.
  • Mỗi khi bạn thực hiện một lần đăng nhập được phép và không thành công, hãy tăng số lần không thành công lên 1 và ghi lại thời gian không thành công.
  • Mỗi lần bạn thực hiện một lần đăng nhập được phép và xóa thành công thông tin cho IP đó.
0

Duy trì số lần đăng nhập sai và nếu nó đạt đến N, hãy chặn người dùng và yêu cầu đặt lại hình ảnh xác thực hoặc đặt lại mật khẩu để tiếp tục.