it-swarm-vi.com

Làm thế nào một hệ thống có thể thực thi một số lượng ký tự thay đổi tối thiểu trong mật khẩu, mà không lưu trữ hoặc xử lý mật khẩu cũ trong văn bản rõ ràng?

Trong một số môi trường, người dùng phải thay đổi một số ký tự nhất định mỗi lần họ tạo mật khẩu mới. Điều này là tất nhiên để ngăn mật khẩu dễ đoán, đặc biệt là với kiến ​​thức về mật khẩu cũ, chẳng hạn như một nhân viên đã rời đi có thể có tài khoản dịch vụ chia sẻ.

Tôi có riêngcâu hỏi mở cho bên đẩy nút địa chỉ của cơ quan thi hành án này. Tuy nhiên, tôi cũng tò mò về cách thức thực thi này hoạt động ở mặt sau. Nếu mật khẩu Cleartext không thể được lấy từ thuật toán băm mạnh, làm thế nào để hệ thống xác định có bao nhiêu ký tự đã được thay đổi trong mật khẩu mới?

52
Iszi

Tôi không chắc chắn về việc so sánh với tất cả các mật khẩu mà người dùng đã sử dụng trước đây, vì nó thực sự phụ thuộc vào hệ thống băm mà bạn sử dụng và tôi sẽ nói nếu có thể lấy được bất kỳ sự tương tự nào từ hàm băm thì đó không phải là một hệ thống rất tốt để bắt đầu với.

Nhưng giả sử rằng người dùng phải cung cấp mật khẩu hiện tại của họ khi đặt mật khẩu mới, ít nhất bạn có thể kiểm tra mật khẩu mới so với mật khẩu hiện tại vì bạn sẽ không bị làm phiền tại thời điểm đó.

Các pam_cracklib mô-đun trên Linux kiểm tra mật khẩu như thế này và thực hiện một vài kiểm tra cơ bản theo mặc định.

  • Là mật khẩu mới chỉ là mật khẩu cũ với các chữ cái bị đảo ngược ("mật khẩu" so với "drowssap") hay được xoay ("mật khẩu" so với "asswordp")?
  • Có phải mật khẩu mới chỉ khác với mật khẩu cũ do thay đổi trường hợp ("mật khẩu" so với "Mật khẩu")?
  • Có ít nhất một số ký tự tối thiểu trong mật khẩu mới không có trong mật khẩu cũ? Đây là nơi tham số "Difok" phát huy tác dụng.

Bạn có thể tìm thêm một số chi tiết về nó tại đây .

47
Mark Davidson

Điều này được thực hiện dễ dàng khi thay đổi mật khẩu (nơi người dùng đang ở và nên được yêu cầu cung cấp cả mật khẩu cũ và mật khẩu mới).

27
frankodwyer

Thông thường, khi bạn thay đổi mật khẩu, trước tiên bạn cần nhập mật khẩu cũ. Điều này rất hữu ích để bảo mật, để đảm bảo rằng ai đó đi ngang qua máy tính của bạn không thể nhanh chóng thay đổi mật khẩu và khóa bạn trong khi quay lưng lại. Nó cũng cho phép máy chủ thực thi các quy tắc khoảng cách mật khẩu. Máy chủ chỉ cần giữ mật khẩu cũ trong bộ nhớ miễn là phải xác minh rằng mật khẩu mới đủ khác biệt so với mật khẩu cũ. Nó không bao giờ cần lưu trữ mật khẩu chưa được xóa.

Nhân tiện, các quy tắc thay đổi mật khẩu như vậy là xấu cho bảo mật. (Vâng, tôi biết bạn là nạn nhân ở đây.) Nếu người dùng phải thay đổi mật khẩu thường xuyên, họ sẽ chọn một mật khẩu rất dễ nhớ hoặc ghi lại ở nơi dễ truy cập. Có rất ít lợi thế trong việc hết hạn mật khẩu và sự mất mát về mật khẩu dự kiến ​​sẽ khiến người dùng thay đổi mật khẩu cứ sau vài tháng thay vì bù đắp những lợi thế đó. Để xử lý sâu hơn về hết hạn mật khẩu, hãy xem Làm thế nào để thay đổi mật khẩu của bạn sau mỗi 90 ngày làm tăng tính bảo mật?Việc buộc người dùng thay đổi mật khẩu có hữu ích không?Yêu cầu thay đổi mật khẩu thường xuyên nhưng lưu trữ mật khẩu trước đó?

Người dùng nên nhập cả mật khẩu cũ và mật khẩu mới để thay đổi mật khẩu. Vì vậy, việc so sánh mật khẩu mới với mật khẩu cũ có thể dễ dàng được thực hiện bởi vì phiên bản văn bản gốc được cung cấp bởi người dùng.

Để so sánh mật khẩu mới với mật khẩu trước đó (không phải mật khẩu hiện tại), việc kiểm tra chỉ có thể được thực hiện bằng cách so sánh kết quả băm. Bất kỳ phương pháp nào cho phép mọi so sánh khác sẽ là một lỗ hổng bảo mật.

5
Jacco

Thông thường, khi bạn thay đổi mật khẩu, trước tiên bạn cần nhập mật khẩu cũ. Điều này rất hữu ích để bảo mật, để đảm bảo rằng ai đó đi ngang qua máy tính của bạn không thể nhanh chóng thay đổi mật khẩu và khóa bạn trong khi quay lưng lại. Nó cũng cho phép máy chủ thực thi các quy tắc khoảng cách mật khẩu. Máy chủ chỉ cần giữ mật khẩu cũ trong bộ nhớ miễn là phải xác minh rằng mật khẩu mới đủ khác biệt so với mật khẩu cũ. Nó không bao giờ cần lưu trữ mật khẩu chưa được xóa và có thể xóa băm cũ ngay khi lưu trữ mật khẩu mới.

Nếu máy chủ kiểm tra sự bình đẳng với các mật khẩu cũ hơn, không chỉ là mật khẩu cuối cùng, thì đó là một câu chuyện khác. Thật dễ dàng để kiểm tra việc sử dụng lại mật khẩu với các giá trị băm cũ: đối với mỗi hàm băm cũ, hãy tính hàm băm của mật khẩu mới với muối cũ và so sánh với giá trị băm cũ. Trên một hệ thống được cấu hình đúng, việc này sẽ mất vài giây.

Sẽ là một vấn đề khác nếu máy chủ đang kiểm tra sự giống nhau với mật khẩu cũ và không chỉ là sự bình đẳng với mật khẩu cũ cộng với sự tương tự với mật khẩu trước đó. Nếu máy chủ đang sử dụng băm thích hợp, thì nó phải thử các biến thể của mật khẩu mới và băm từng biến thể với tất cả các muối cũ. Điều đó có thể mất vài phút hoặc nhiều hơn với số lượng biến thể không đáng kể. Vì vậy, nếu máy chủ phàn nàn về sự giống nhau với mật khẩu cũ hơn, tôi sẽ cảnh giác rằng họ có thể lưu trữ mật khẩu được băm không đúng cách.

Có một cách tiếp cận khác cho sự tương tự, đó là lưu trữ hàm băm của từng biến thể mật khẩu, mỗi loại muối độc lập, ngay khi mật khẩu được đặt. Nhưng điều đó không mua cho bạn nhiều: máy chủ vẫn cần tính toán hàm băm của mật khẩu mới với tất cả các muối này, việc này vẫn mất nhiều thời gian, quá lâu để thay đổi mật khẩu thông thường.

Một cách để khôi phục mật khẩu cũ thực sự hoạt động, nhưng tôi chưa bao giờ thấy được thực hiện ở bất cứ đâu, là thực hiện các thao tác sau khi thay đổi mật khẩu, sau khi nhắc người dùng nhập mật khẩu cũ và trước khi xóa mật khẩu cũ khỏi bộ nhớ:

  • Lấy khóa đối xứng từ mật khẩu mới (sử dụng thuật toán tăng cường khóa).
  • Lấy một khóa từ mật khẩu cũ theo cùng một cách.
  • Giải mã danh sách mật khẩu cũ bằng khóa cũ.
  • Nối mật khẩu cũ vào danh sách.
  • Thực hiện kiểm tra chính sách - tất cả các mật khẩu trước được biết đến tại thời điểm này. Nếu mật khẩu mới vượt qua séc
  • Mã hóa danh sách mật khẩu cũ bằng khóa mới.
  • Thay đổi mật khẩu và danh sách mã hóa mật khẩu trước cơ sở dữ liệu.

Điều này có phần rủi ro vì nếu mật khẩu hiện tại bị xâm phạm, tất cả mật khẩu trước đó cũng bị lộ. Nhưng nó cho phép thực thi chính sách khoảng cách mật khẩu với bất kỳ số lượng mật khẩu trước đó với nỗ lực tính toán hợp lý.

Nó chỉ có thể được thực hiện bằng cách giữ băm, thậm chí có thể được thực hiện qua nhiều lần lặp.

Phương pháp sẽ là lấy mật khẩu và lặp lại thông qua hàm băm và kiểm tra so sánh với các giá trị được lưu trữ.

Ví dụ, hầu hết người dùng (và những người trong bàn dịch vụ thích dự phòng điều này như là phương sách cuối cùng với các loại quan trọng tức giận) sẽ lặp lại mật khẩu của họ một cách đơn giản đến không ngờ.

Vì vậy, lấy mật khẩu: # foob @ r1 và làm cho nó # foob @ r2 mà bạn có thể thấy có thể được kiểm tra mà không cần biết về # foob @ r1 bằng cách nhanh chóng thực hiện một cú đánh mạnh vào thuật toán. Với sức mạnh xử lý hiện đại, bạn có thể lặp lại qua 4 ký tự đầu tiên trong vòng chưa đầy mười giây.

Mặc dù vì hiệu quả, bốn người cuối cùng thường là những người thay đổi, vì vậy bạn có thể thấy tiếng nổ lớn hơn cho đồng tiền của mình ở đó. Nếu bạn sẽ không liên tục và liên tiếp, bạn đang nhìn vào một sự chờ đợi khá lớn cho người dùng cuối và một bộ xử lý lớn.

5
Ori