Tại sao việc kiểm tra mật khẩu sai lại mất nhiều thời gian hơn so với việc kiểm tra mật khẩu đúng?


83

Câu hỏi này luôn làm tôi băn khoăn.

Trên Linux, khi được hỏi mật khẩu, nếu đầu vào của bạn là chính xác, nó sẽ kiểm tra ngay lập tức, hầu như không có độ trễ. Tuy nhiên, mặt khác, nếu bạn nhập sai mật khẩu, bạn sẽ mất nhiều thời gian hơn để kiểm tra. Tại sao vậy?

Tôi đã quan sát thấy điều này trong tất cả các bản phân phối Linux mà tôi đã từng thử.


Bạn sẽ thấy điều này cũng đúng với Windows. Ngoài ra, việc thay đổi Tiêu đề thành một cái gì đó như, "Tại sao mật khẩu sai mất nhiều thời gian hơn mật khẩu đúng." Sẽ làm cho nó liên quan đến lập trình hơn.
he_the_great

Tôi vừa đăng nhập vào hệ thống Ubuntu của mình, nhập sai mật khẩu và tự hỏi mình câu hỏi tương tự. :-)
johngreen

Câu trả lời:


106

Nó thực sự để ngăn chặn các cuộc tấn công vũ phu thử hàng triệu mật khẩu mỗi giây. Ý tưởng là giới hạn tốc độ kiểm tra mật khẩu và có một số quy tắc cần được tuân thủ.

  • Một cặp mật khẩu / người dùng thành công sẽ thành công ngay lập tức.
  • Không được sự khác biệt rõ ràng về lý do hỏng hóc có thể được phát hiện.

Điều cuối cùng là đặc biệt quan trọng. Nó có nghĩa là không có thông điệp hữu ích như:

Your user name is correct but your password is wrong, please try again

hoặc là:

Sorry, password wasn't long enough

Thậm chí không có sự khác biệt về thời gian trong phản hồi giữa lý do thất bại "người dùng và mật khẩu không hợp lệ" và "người dùng hợp lệ nhưng mật khẩu không hợp lệ".

Mọi thất bại phải cung cấp chính xác cùng một thông tin, dạng văn bản và khác.

Một số hệ thống thậm chí còn làm điều đó xa hơn, làm tăng độ trễ với mỗi lần hỏng hoặc chỉ cho phép ba lần hỏng sau đó có độ trễ lớn trước khi cho phép thử lại.


1
Điều này làm thế nào để ngăn một ứng dụng bẻ khóa, thử mật khẩu và nếu nó không trả lại thành công trong một khoảng thời gian, hãy giết -9 đứa trẻ và fork lại. Có, điều đó chỉ hoạt động nếu bạn có thể đăng nhập với tư cách là một số người dùng nhưng điều đó đã dừng bất kỳ ai?
BCS

2
Nó không ngăn cản bất cứ ai nhưng bạn vẫn phải trì hoãn trong "một khoảng thời gian" đó. Ngay cả một sự chậm trễ nhỏ cũng làm cho việc kiểm tra hàng triệu mật khẩu trở nên vô ích và bạn sẽ bị phát hiện nếu đang thực hiện việc đó khi đang đăng nhập - bạn có nghĩ rằng không có gì được ghi lại cho những lần đăng nhập không thành công?
paxdiablo

5
BCS: nếu bạn đã có thông tin đăng nhập hợp lệ với đủ đặc quyền để thực hiện những gì bạn đề xuất, rất có thể bạn không còn cần đến các cuộc tấn công bạo lực nữa (vì có các vectơ tấn công khác dành cho bạn). Sự chậm trễ hữu ích nhất để chống lại những kẻ tấn công bên ngoài.
Erich Kitzmueller


12

Tôi không chắc lắm, nhưng khá phổ biến là tích hợp độ trễ sau khi nhập sai mật khẩu để khiến các cuộc tấn công khó khăn hơn. Điều này làm cho một cuộc tấn công không thể thực hiện được, vì bạn sẽ mất nhiều thời gian để chỉ kiểm tra một vài mật khẩu.

Ngay cả việc thử một vài mật khẩu - ngày sinh, tên của con mèo và những thứ tương tự - cũng chẳng có gì thú vị cả.


Và thường thì thời gian chờ ở lần thất bại thứ hai dài hơn thời gian chờ ở lần đầu tiên - điều này cũng tốt.
Jonathan Leffler

Bạn có thấy bài đăng tin tức về các mật khẩu có khả năng xảy ra nhất không? 123456 rất phổ biến!
Spence

@Spence, tôi thực sự đã nhìn thấy những món đồ đó nhưng, từ trí nhớ, nó không tệ như mọi người tạo ra, họ (như các phương tiện truyền thông không muốn làm) thổi nó ra khỏi tỷ lệ. Mật khẩu được lấy từ danh sách các tài khoản bị xâm nhập được tìm thấy trên mạng, có nghĩa là chúng có nhiều khả năng không an toàn (vì chúng đã bị xâm phạm). cũng123456 có thể chiếm 30% (ví dụ) các tài khoản bị xâm nhập nhưng không có khả năng ở bất kỳ đâu gần mức quan trọng đó trên tất cả các tài khoản.
paxdiablo

Không, những danh sách đó là từ các cuộc tấn công cơ sở dữ liệu mật khẩu và hầu hết chúng đại diện cho các tập hợp mẫu trong hàng triệu. Kết quả từ những vụ hack này đã được xác nhận trên nhiều bộ dữ liệu trực tuyến và mang tính đại diện cao cho người tiêu dùng "trung bình". Chỉ có cách để có được mật khẩu tốt hơn là thực thi mật khẩu khi tạo, hoặc tốt hơn là sử dụng xác thực 2 yếu tố, điều này dù sao cũng hữu ích hơn nhiều.
Spence

12

Về cơ bản để giảm thiểu chống lại các cuộc tấn công vũ phu và từ điển.

Từ Hướng dẫn của Nhà phát triển Ứng dụng Linux-PAM :

Lập kế hoạch cho sự chậm trễ

extern int pam_fail_delay(pam_handle_t *pamh, unsigned int micro_sec);

Chức năng này được cung cấp bởi Linux-PAM để tạo điều kiện cho việc trì hoãn thời gian sau một cuộc gọi không thành công tới pam_authenticate () và trước khi quyền điều khiển được trả lại cho ứng dụng. Khi sử dụng chức năng này, người lập trình ứng dụng nên kiểm tra xem nó có khả dụng với,

#ifdef PAM_FAIL_DELAY
    ....
#endif /* PAM_FAIL_DELAY */

Nói chung, một ứng dụng yêu cầu người dùng được xác thực bởi Linux-PAM thông qua lệnh gọi tới pam_authenticate () hoặc pam_chauthtok (). Các hàm này gọi từng mô-đun xác thực xếp chồng lên nhau được liệt kê trong tệp cấu hình Linux-PAM có liên quan. Theo chỉ dẫn của tệp này, một trong các mô-đun khác có thể bị lỗi khiến lệnh gọi pam _... () trả về lỗi. Cũng cần tạm dừng trước khi ứng dụng tiếp tục. Lý do chính cho sự chậm trễ như vậy là do bảo mật: sự chậm trễ này chủ yếu ngăn cản các cuộc tấn công từ điển brute force, nhưng cũng giúp cản trở các cuộc tấn công theo thời gian (kênh bí mật).


8

Đó là một cách rất đơn giản, hầu như không tốn nhiều công sức để tăng cường bảo mật. Xem xét:

  1. Hệ thống Akhông có độ trễ. Kẻ tấn công có một chương trình tạo kết hợp tên người dùng / mật khẩu. Với tốc độ hàng nghìn lần thử mỗi phút, chỉ mất vài giờ để thử mọi kết hợp và ghi lại tất cả các lần đăng nhập thành công.

  2. Hệ thống Btạo ra độ trễ 5 giây sau mỗi lần đoán sai. Hiệu quả của kẻ tấn công đã giảm xuống còn 12 nỗ lực mỗi phút, làm tê liệt một cách hiệu quả cuộc tấn công bạo lực. Thay vì hàng giờ, có thể mất hàng tháng để tìm thông tin đăng nhập hợp lệ. Nếu tin tặc kiên nhẫn như vậy, họ sẽ hợp pháp. :-)


4

Sự chậm trễ xác thực không thành công có để giảm tỷ lệ đăng nhập. Ý tưởng rằng nếu ai đó đang thử từ điển hoặc một cuộc tấn công bạo lực chống lại một hoặc có thể tài khoản người dùng thì kẻ tấn công sẽ phải đợi sự chậm trễ thất bại và do đó buộc anh ta phải mất nhiều thời gian hơn và cho bạn nhiều cơ hội hơn để phát hiện ra nó.

Bạn cũng có thể muốn biết rằng, tùy thuộc vào những gì bạn đang sử dụng làm trình bao đăng nhập, thường có một cách để định cấu hình độ trễ này.

Trong GDM, độ trễ được đặt trong tệp gdm.conf (thường trong /etc/gdm/gdm.conf). bạn cần đặt RetryDelay = x trong đó x là giá trị tính bằng giây.

Hầu hết các bản phân phối linux ngày nay cũng hỗ trợ việc xác định FAIL_DELAY trong /etc/login.defs cho phép bạn đặt thời gian chờ sau khi đăng nhập không thành công.

Cuối cùng, PAM cũng cho phép bạn đặt thuộc tính gật đầu trên dòng xác thực của mình để bỏ qua độ trễ thất bại. ( Đây là một bài viết về PAM và linux )


1

Tôi không thấy rằng nó có thể đơn giản như những câu trả lời gợi ý.

Nếu phản hồi cho một mật khẩu đúng là (một số giá trị của) ngay lập tức, không phải bạn chỉ phải đợi lâu hơn giá trị đó để biết mật khẩu là sai? (ít nhất là biết một cách xác suất, điều này tốt cho mục đích bẻ khóa) Và dù sao thì bạn cũng sẽ chạy cuộc tấn công này song song ... đây có phải là tất cả một tấm thảm chào mừng DoS lớn không?


đó không phải là ý của họ. Có một sự khác biệt rõ ràng giữa việc lấy sai hay đúng mật khẩu. ý của họ là không được có sự khác biệt giữa tên người dùng không chính xác và mật khẩu không chính xác. và bạn có nghĩa là chạy cuộc tấn công này song song? làm thế nào bạn có thể chạy nó song song?
mpen

@Mark, chạy song song có thể sẽ đòi hỏi phải mở nhiều kết nối và cố gắng đăng nhập. Vẫn tốn thời gian và không thực tế lắm.
he_the_great

Nếu bạn có thể chạy một triệu lần kiểm tra mỗi giây trên một kết nối không bị chậm và kết nối sau đó có thêm độ trễ 1 giây cho những lần thử không thành công, bạn sẽ cần một triệu máy khách tấn công để có được hiệu quả tương tự. Tôi nghi ngờ máy chủ sẽ cho phép nhiều phiên telnet được tạo.
paxdiablo

vấn đề là bạn không cần phải đợi hết thời gian trước khi thử mật khẩu tiếp theo, vậy việc sử dụng là gì?

@Greg, bạn phải kết nối lại với máy chủ lưu trữ và nếu cần, bước tiếp theo sẽ là kiểm tra địa chỉ IP để nắm bắt điều này.
paxdiablo

1

Những gì tôi đã cố gắng trước đây dường như có hiệu quả, nhưng thực tế thì không; nếu bạn quan tâm, bạn phải xem lại lịch sử chỉnh sửa wiki ...

Có gì không làm việc (đối với tôi) là để cả hai làm giảm giá trị của sự chậm trễ pam_faildelay.so = X trong /etc/pam.d/login (Tôi cúi nó để 500000, nửa giây), và cũng có thể thêm nodelay (trước bởi một dấu cách) đến cuối dòng theo phương thức chung , như Gabriel mô tả trong câu trả lời của mình.

auth [success=1 default=ignore] pam_unix.so nullok_secure nodelay

Ít nhất đối với tôi (debian sid), chỉ thực hiện một trong những thay đổi này sẽ không rút ngắn độ trễ đáng kể xuống dưới 3 giây mặc định, mặc dù có thể kéo dài độ trễ bằng cách chỉ thay đổi giá trị trong /etc/pam.d/login.

Cái kiểu tào lao này cũng đủ khiến một người đàn ông trưởng thành phải khóc thét!


0

Trên Ubuntu 9.10 và tôi nghĩ các phiên bản mới cũng vậy, tệp bạn đang tìm kiếm nằm trên

/etc/pam.d/login

chỉnh sửa dòng:

auth tùy chọn pam_faildelay.so delay = 3000000

thay đổi số 3 bằng một số khác mà bạn có thể muốn.

Lưu ý rằng để có xác thực 'gật đầu', TÔI NGHĨ bạn nên chỉnh sửa tệp

/etc/pam.d/common-auth

quá. Trên đường dây:

auth [thành công = 1 mặc định = bỏ qua] pam_unix.so nullok_secure

thêm 'gật đầu' vào cuối cùng (không có dấu ngoặc kép). Nhưng lời giải thích cuối cùng về 'gật đầu' là những gì tôi nghĩ.


0

Tôi muốn thêm một lưu ý từ quan điểm của nhà phát triển. Mặc dù điều này sẽ không rõ ràng bằng mắt thường, một nhà phát triển thông minh sẽ thoát ra khỏi truy vấn đối sánh khi tìm thấy kết quả phù hợp. Chứng tỏ, một trận đấu thành công sẽ hoàn thành nhanh hơn một trận đấu thất bại. Bởi vì, hàm đối sánh sẽ so sánh thông tin đăng nhập với tất cả các tài khoản đã biết cho đến khi tìm thấy kết quả khớp chính xác. Nói cách khác, giả sử có 1.000.000 tài khoản người dùng theo thứ tự ID; 001, 002, 003, v.v. ID của bạn là 43.001. Vì vậy, khi bạn nhập đúng tên người dùng và mật khẩu, quá trình quét sẽ dừng lại ở 43.001 và đăng nhập cho bạn. Nếu thông tin đăng nhập của bạn không chính xác thì nó sẽ quét tất cả 1.000.000 bản ghi. Sự khác biệt về thời gian xử lý trên máy chủ lõi kép có thể tính bằng mili giây. Trên Windows Vista với 5 tài khoản người dùng, nó sẽ tính bằng nano giây.


Tôi nghĩ rằng bạn sẽ thấy 99% áp phích ở đây là các nhà phát triển ở cấp độ này hay cấp độ khác. Đừng có vẻ hào hoa nữa.

Tôi sử dụng Ubuntu và chỉ có một người dùng. Tuy nhiên, khi tôi gửi mật khẩu sai, phải mất 3 giây để tôi nhận được phản hồi. Vì vậy, bạn đã sai :)
Halil Bilgin

0

Tôi đồng ý. Đây là một quyết định lập trình tùy ý. Đặt độ trễ xuống một giây thay vì ba không thực sự làm tổn hại đến khả năng bẻ khóa của mật khẩu, nhưng làm cho nó thân thiện hơn với người dùng.


0

Về mặt kỹ thuật, điều này cố tình trì hoãn này là để ngăn chặn các cuộc tấn công như "Cuộc tấn công tuyến tính hóa" (còn có các cuộc tấn công và lý do khác nữa) .

Để minh họa cuộc tấn công, hãy xem xét một chương trình (không có sự cố ý trì hoãn này), chương trình này sẽ kiểm tra một chuỗi đã nhập để xem liệu nó có khớp với chuỗi chính xác hay không, trong trường hợp này là " xyba " . Để hiệu quả, lập trình viên quyết định kiểm tra từng ký tự một và thoát ra ngay khi phát hiện thấy ký tự không chính xác, trước khi bắt đầu độ dài cũng được kiểm tra.

Độ dài nối tiếp chính xác sẽ mất nhiều thời gian để xử lý hơn độ dài nối tiếp không chính xác. Thậm chí tốt hơn (đối với kẻ tấn công), một số sê-ri có ký tự đầu tiên chính xác sẽ mất nhiều thời gian hơn bất kỳ số nào có ký tự đầu tiên không chính xác. Các bước liên tiếp trong thời gian chờ là do mỗi lần có thêm một vòng lặp, hãy so sánh để thực hiện đúng đầu vào.

  • Vì vậy, kẻ tấn công có thể chọn một chuỗi bốn ký tự và chuỗi bắt đầu bằng x sẽ mất nhiều thời gian nhất. (bằng cách đoán công việc)
  • Kẻ tấn công sau đó có thể sửa chữa nhân vật là x và thay đổi ký tự thứ hai, trong trường hợp đó họ sẽ thấy rằng y mất nhiều thời gian nhất.
  • Kẻ tấn công sau đó có thể sửa hai ký tự đầu tiên là xy và thay đổi ký tự thứ ba, trong trường hợp đó, họ sẽ thấy rằng b mất nhiều thời gian nhất.
  • Kẻ tấn công sau đó có thể sửa ba ký tự đầu tiên thành xyb và thay đổi ký tự thứ tư, trong trường hợp đó chúng sẽ thấy rằng một mất nhiều thời gian nhất.

Do đó, những kẻ tấn công có thể khôi phục từng ký tự nối tiếp một.

Tuyến tính hóa.java.

Tuyến tính hóa.docx, đầu ra mẫu

Số sê-ri dài bốn ký tự, mỗi ký tự có 128 giá trị có thể. Khi đó có 128 4 = 2 28 = 268.435.456 nối tiếp có thể có . Nếu kẻ tấn công phải đoán ngẫu nhiên các số sê-ri đầy đủ, cô ta sẽ đoán số sê-ri trong khoảng 2 27 = 134.217.728 lần thử, đó là một khối lượng công việc khổng lồ . Mặt khác, bằng cách sử dụng cuộc tấn công tuyến tính hóa ở trên, trung bình chỉ cần 128/2 = 64 lần đoán cho mỗi chữ cái, cho tổng công việc dự kiến ​​là khoảng 4 * 64 = 2 8 = 256 lần đoán, đó là một số tiền nhỏ. của công việc.

Phần lớn văn bản võ thuật được chuyển thể từ điều này (trích từ "Bảo mật thông tin: Nguyên tắc và thực hành" của Mark Stamp). Ngoài ra, các tính toán ở trên không tính đến số lượng phỏng đoán cần thiết để tìm ra độ dài nối tiếp chính xác.

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.