Làm thế nào tôi có thể ước tính entropy của một mật khẩu?


14

Sau khi đọc các tài nguyên khác nhau về độ mạnh của mật khẩu, tôi đang cố gắng tạo ra một thuật toán sẽ cung cấp ước tính sơ bộ về mức độ entropy của một mật khẩu.

Tôi đang cố gắng tạo ra một thuật toán toàn diện nhất có thể. Tại thời điểm này tôi chỉ có mã giả, nhưng thuật toán bao gồm các phần sau:

  • độ dài mật khẩu
  • nhân vật lặp đi lặp lại
  • mô hình (logic)
  • không gian nhân vật khác nhau (LC, UC, Numeric, Special, Extended)
  • tấn công từ điển

Nó KHÔNG bao gồm những điều sau đây, và NÊN che nó lại (mặc dù không hoàn hảo):

  • đặt hàng (mật khẩu có thể được sắp xếp nghiêm ngặt theo đầu ra của thuật toán này)
  • mô hình (không gian)

Bất cứ ai cũng có thể cung cấp một số cái nhìn sâu sắc về những gì thuật toán này có thể yếu? Cụ thể, có ai có thể nghĩ đến các tình huống trong đó việc cung cấp mật khẩu cho thuật toán sẽ TÌM HIỂU sức mạnh của nó không? Đánh giá thấp là một vấn đề.

Thuật toán:

// the password to test
password = ?
length = length(password)

// unique character counts from password (duplicates discarded)
uqlca = number of unique lowercase alphabetic characters in password
uquca = number of uppercase alphabetic characters
uqd   = number of unique digits
uqsp  = number of unique special characters (anything with a key on the keyboard)
uqxc  = number of unique special special characters (alt codes, extended-ascii stuff)

// algorithm parameters, total sizes of alphabet spaces
Nlca = total possible number of lowercase letters (26)
Nuca = total uppercase letters (26)
Nd   = total digits (10)
Nsp  = total special characters (32 or something)
Nxc  = total extended ascii characters that dont fit into other categorys (idk, 50?)

// algorithm parameters, pw strength growth rates as percentages (per character)
flca = entropy growth factor for lowercase letters (.25 is probably a good value)
fuca = EGF for uppercase letters (.4 is probably good)
fd   = EGF for digits (.4 is probably good)
fsp  = EGF for special chars (.5 is probably good)
fxc  = EGF for extended ascii chars (.75 is probably good)

// repetition factors.  few unique letters == low factor, many unique == high
rflca = (1 - (1 - flca) ^ uqlca)
rfuca = (1 - (1 - fuca) ^ uquca)
rfd   = (1 - (1 - fd  ) ^ uqd  )
rfsp  = (1 - (1 - fsp ) ^ uqsp )
rfxc  = (1 - (1 - fxc ) ^ uqxc )

// digit strengths
strength =
( rflca * Nlca + 
  rfuca * Nuca +
  rfd   * Nd   +
  rfsp  * Nsp  +
  rfxc  * Nxc    ) ^ length

entropybits = log_base_2(strength)

Một vài đầu vào và đầu ra entropy_bits mong muốn và thực tế của chúng:

INPUT           DESIRED        ACTUAL
aaa             very pathetic  8.1
aaaaaaaaa       pathetic       24.7
abcdefghi       weak           31.2
H0ley$Mol3y_    strong         72.2
s^fU¬5ü;y34G<   wtf            88.9
[a^36]*         pathetic       97.2
[a^20]A[a^15]*  strong         146.8
xkcd1**         medium         79.3
xkcd2**         wtf            160.5

* these 2 passwords use shortened notation, where [a^N] expands to N a's.
** xkcd1 = "Tr0ub4dor&3", xkcd2 = "correct horse battery staple"

Thuật toán nhận ra (chính xác) việc tăng kích thước bảng chữ cái (thậm chí bằng một chữ số) giúp tăng cường đáng kể mật khẩu dài, như được thể hiện bằng sự khác biệt về entropy_bits cho mật khẩu thứ 6 và thứ 7, cả hai đều bao gồm 36 a, nhưng thứ hai là 21 viết hoa Tuy nhiên, họ không giải thích cho việc có mật khẩu 36 a không phải là ý hay, nó dễ bị phá vỡ với trình bẻ khóa mật khẩu yếu (và bất kỳ ai theo dõi bạn gõ đều sẽ thấy nó) và thuật toán không phản ánh điều đó .

Tuy nhiên, nó phản ánh thực tế rằng xkcd1 là mật khẩu yếu so với xkcd2, mặc dù có mật độ phức tạp lớn hơn (đây có phải là một điều không?).

Làm thế nào tôi có thể cải thiện thuật toán này?

Phụ lục 1

Các cuộc tấn công từ điển và các cuộc tấn công dựa trên mô hình dường như là vấn đề lớn, vì vậy tôi sẽ cố gắng giải quyết chúng.

Tôi có thể thực hiện tìm kiếm toàn diện thông qua mật khẩu cho các từ trong danh sách từ và thay thế các từ bằng mã thông báo duy nhất cho các từ mà chúng đại diện. Word-tokens sau đó sẽ được coi là ký tự và có hệ thống trọng lượng riêng và sẽ thêm trọng lượng riêng vào mật khẩu. Tôi cần một vài tham số thuật toán mới (tôi sẽ gọi chúng là lw, Nw ~ = 2 ^ 11, fw ~ = .5 và rfw) và tôi sẽ tính trọng số vào mật khẩu như bất kỳ mật khẩu nào khác trọng lượng.

Tìm kiếm từ này có thể được sửa đổi đặc biệt để khớp cả chữ thường và chữ in hoa cũng như thay thế ký tự thông thường, như của E với 3. Nếu tôi không thêm trọng lượng cho các từ khớp như vậy, thuật toán sẽ đánh giá thấp sức mạnh của chúng một chút hoặc hai từ mỗi từ, đều ổn. Nếu không, một quy tắc chung sẽ là, đối với mỗi nhân vật không hoàn hảo phù hợp, hãy cho từ đó một chút tiền thưởng.

Sau đó, tôi có thể thực hiện kiểm tra mẫu đơn giản, chẳng hạn như tìm kiếm các ký tự lặp lại và kiểm tra đạo hàm (lấy sự khác biệt giữa từng ký tự), để xác định các mẫu như 'aaaaa' và '12345' và thay thế từng mẫu được phát hiện bằng một mẫu mã thông báo, duy nhất cho mẫu và chiều dài. Các tham số thuật toán (cụ thể là entropy trên mỗi mẫu) có thể được tạo khi đang bay dựa trên mẫu.

Tại thời điểm này, tôi sẽ lấy độ dài của mật khẩu. Mỗi mã thông báo từ và mã thông báo mẫu sẽ được tính là một ký tự; mỗi mã thông báo sẽ thay thế các ký tự mà chúng đại diện một cách tượng trưng.

Tôi đã tạo ra một số loại ký hiệu mẫu, nhưng nó bao gồm chiều dài mẫu l, thứ tự mẫu o và phần tử cơ sở b. Thông tin này có thể được sử dụng để tính một số trọng lượng tùy ý cho mỗi mẫu. Tôi sẽ làm một cái gì đó tốt hơn trong mã thực tế.

Ví dụ đã sửa đổi:

Password:          1234kitty$$$$$herpderp
Tokenized:         1 2 3 4 k i t t y $ $ $ $ $ h e r p d e r p
Words Filtered:    1 2 3 4 @W5783 $ $ $ $ $ @W9001 @W9002
Patterns Filtered: @P[l=4,o=1,b='1'] @W5783 @P[l=5,o=0,b='$'] @W9001 @W9002

Breakdown:         3 small, unique words and 2 patterns
Entropy:           about 45 bits, as per modified algorithm

Password:          correcthorsebatterystaple
Tokenized:         c o r r e c t h o r s e b a t t e r y s t a p l e
Words Filtered:    @W6783 @W7923 @W1535 @W2285

Breakdown:         4 small, unique words and no patterns
Entropy:           43 bits, as per modified algorithm

Các ngữ nghĩa chính xác về cách tính entropy từ các mẫu được đưa ra để thảo luận. Tôi đã suy nghĩ một cái gì đó như:

entropy(b) * l * (o + 1) // o will be either zero or one

Thuật toán được sửa đổi sẽ tìm thấy các lỗ hổng với và giảm độ mạnh của từng mật khẩu trong bảng gốc, ngoại trừ s^fU¬5ü;y34G<, không chứa từ hoặc mẫu.


2
Bạn đã thấy tech.dropbox.com/?p=165 chưa? Nó có thể cung cấp cho bạn một số ý tưởng. Có một bản demo tại dl.dropbox.com/u/209/zxcvbn/test/index.html và mã nằm trên github.


một tùy chọn có thể là chạy chúng thông qua thuật toán nén và xem mức độ nén của chúng, điều duy nhất ở đây là hầu hết các thuật toán nén được thiết kế để hoạt động với lượng dữ liệu lớn và bạn cần một lượng dữ liệu nhỏ
jk.

1
@mouviciel: Tôi đánh bạn tới cú đấm. Đọc dòng đầu tiên: D
Wug

@Wug - Tuyệt vời! Tôi đã không theo liên kết: không thể tưởng tượng rằng các tài nguyên khác nhau bao gồm loại nghiên cứu đó!
mouviciel

Câu trả lời:


9

Phụ lục A trên p46 của NIST SP 800-63 nói về công việc của Claude Shannon , người ước tính entropy mật khẩu bằng cách sử dụng một số bit. Thật vậy, đây là tài liệu mà phim hoạt hình XKCD sử dụng để tính toán các bit entropy. Đặc biệt:

  • entropy của ký tự đầu tiên được lấy là 4 bit;
  • entropy của 7 ký tự tiếp theo là 2 bit cho mỗi ký tự; điều này gần như phù hợp với ước tính của Shannon rằng, khi các hiệu ứng thống kê kéo dài không quá 8 chữ cái được coi là entropy là khoảng 2,3 bit cho mỗi ký tự;
  • đối với ký tự thứ 9 đến thứ 20, entropy được lấy là 1,5 bit cho mỗi ký tự;
  • đối với các ký tự 21 trở lên, entropy được lấy là 1 bit cho mỗi ký tự;
  • Một phần thưởng khác của Phần tử có 6 bit của entropy được gán cho quy tắc thành phần yêu cầu cả ký tự viết hoa và ký tự không chữ cái. Điều này buộc phải sử dụng các ký tự này, nhưng trong nhiều trường hợp, các ký tự này sẽ chỉ xảy ra ở đầu hoặc cuối mật khẩu và nó làm giảm tổng phần không gian tìm kiếm, vì vậy lợi ích có thể khiêm tốn và gần như không phụ thuộc vào độ dài của mật khẩu;
  • Phần thưởng lên tới 6 bit của entropy được thêm vào để kiểm tra từ điển mở rộng. Nếu kẻ tấn công biết từ điển, anh ta có thể tránh kiểm tra các mật khẩu đó, và trong mọi trường hợp, có thể đoán được nhiều từ điển, tuy nhiên, sẽ là mật khẩu được chọn nhiều nhất nếu không có quy tắc từ điển. Giả định là hầu hết các lợi ích của entropy đoán cho một bài kiểm tra từ điển tích lũy với mật khẩu tương đối ngắn, bởi vì bất kỳ mật khẩu dài nào có thể được nhớ nhất thiết phải là một cụm từ mật khẩu Bắt buộc bao gồm các từ trong từ điển, do đó phần thưởng giảm xuống 0 ở mức 20 nhân vật.

Ý tưởng là một hệ thống xác thực sẽ chọn các mức entropy nhất định làm ngưỡng. Ví dụ: 10 bit có thể yếu, 20 trung bình và 30 mạnh (các số được chọn tùy ý làm ví dụ, không phải là khuyến nghị). Thật không may, tài liệu không đề xuất các ngưỡng như vậy, có thể là do sức mạnh tính toán có sẵn cho lực lượng vũ phu hoặc đoán mật khẩu tăng theo thời gian:

Thay thế cho việc áp đặt một số quy tắc cụ thể tùy ý, một hệ thống xác thực có thể phân loại mật khẩu người dùng, sử dụng các quy tắc đã nêu ở trên và chấp nhận bất kỳ quy tắc nào đáp ứng tiêu chuẩn entropy tối thiểu. Ví dụ: giả sử mật khẩu có ít nhất 24 bit entropy được yêu cầu. Chúng ta có thể tính toán ước tính entropy của Hồi IamtheCapitanofthePina4 bằng cách quan sát rằng chuỗi có 23 ký tự và sẽ đáp ứng quy tắc thành phần yêu cầu chữ hoa và ký tự không chữ cái.

Điều này có thể hoặc không thể là những gì bạn đang tìm kiếm nhưng không phải là một điểm tham chiếu xấu, nếu không có gì khác.

[Chỉnh sửa: Đã thêm như sau.]

Bài kiểm tra số liệu chính sách tạo mật khẩu bằng cách tấn công các bộ mật khẩu được tiết lộ lớn (của Matt Weir, Sudhir Aggarwal, Michael Collins và Henry Stern) đã chứng minh mô hình Shannon, được mô tả ở trên, không phải là mô hình chính xác của entropy cho mật khẩu do con người tạo ra. Tôi sẽ khuyên bạn nên xem "Phần 5 Tạo Chính sách tạo mật khẩu mới" để biết các đề xuất chính xác hơn.


3
bài viết Wikipedia về độ mạnh của mật khẩu cho biết các quy tắc được tìm thấy là không chính xác đối với mật khẩu do con người tạo ra.
Ryathal

1
Đúng ( goo.gl/YxRk cho một lần đọc thú vị).
akton

Có một cảnh báo cho điều này tất nhiên. Nó có thể khá chính xác cho các mật khẩu điển hình thống kê, có xu hướng tuân theo các quy tắc nhất định bởi vì mọi người là con người. Các nguyên tắc này sẽ không tính đến thực tế là mật khẩu được tạo ngẫu nhiên sẽ vượt xa mật khẩu do con người tạo ra ở độ dài thông thường vì chúng (có thể) không chứa mẫu và không có từ.
Wug

4

Kiểm tra mã nguồn cho KeePass ở cuối trang này . Các QualityEstimationdụng cụ lớp một thuật toán khá tốt đẹp mà có vẻ là phù hợp với những gì bạn đang tìm kiếm để có tại chỗ. Kết quả của tôi trông như vậy:

aaa                              8
aaaaaaaaa                        9
abcdefghi                       18
H0ley$Mol3y_                    73
s^fU¬5ü;y34G<                   99
[a^36]*                         10
[a^20]A[a^15]*                  18
Tr0ub4dor&3                     66
correct horse battery staple    98

Điều này có tính toán entropy hoặc một số số liệu khác, như có lẽ là nhân chứng không? Ngoài ra, bạn nhớ mở rộng [a ^ 36] thành 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' phải không?
Wug

Er, không, tôi đã sao chép các chuỗi đó nguyên văn :( Tôi hoàn toàn nghĩ rằng đó là cách sử dụng tuyệt vời các ký tự đặc biệt, không phải là biểu thức chính trong cái nhìn đầu tiên. Tôi sẽ cung cấp cho nó một lần nữa và cập nhật nó. Thứ hai, nó tính toán các bit của entropy, vâng .
Jesse C. Choper

1
Đó không phải là một biểu hiện thông thường như một ký hiệu kỳ lạ mà tôi đã sử dụng để tránh phải sắp xếp lại bảng của mình bằng 25 ký tự
Wug

2
Tôi đã phải +1 bình luận đó cho 'enfatten'. Có vẻ như một từ hoàn hảo cromulent cho tình huống này.
Jesse C. Choper

1
Nó thực sự đánh vần là "KeePass", thay vì "KeyPass." (Tôi chỉ cần tự chỉnh sửa, nhưng chúng phải có hơn 6 ký tự ...)
Ian Dunn

1

Bạn hỏi

Cụ thể, bất cứ ai cũng có thể nghĩ về các tình huống trong đó việc cung cấp mật khẩu cho thuật toán sẽ TÌM HIỂU sức mạnh của nó?

Nhưng bạn có một ví dụ trong câu hỏi. Theo thiết kế, xkcd2 có ~ 44 bit entropy, nhưng ước tính của bạn là 160,5 bit.


Vì vậy, khái quát hóa, thuật toán bị phá vỡ khi xem xét các từ hoặc kết hợp các ký tự có khả năng được sử dụng nhiều hơn đáng kể so với các thuật ngữ khác. Tôi cũng sẽ chỉ ra rằng ví dụ xkcd chính tắc không bao gồm khoảng trắng và tính toán của tôi đã làm.
Wug

@Wug, đó là một khái quát công bằng. Đó là một cái gì đó được giải quyết bởi zxcvbn, được đề cập trong bình luận đầu tiên về câu hỏi này.
Peter Taylor

1

Bất cứ ai cũng có thể cung cấp một số cái nhìn sâu sắc về những gì thuật toán này có thể yếu? Cụ thể, bất cứ ai cũng có thể nghĩ về các tình huống trong đó việc cung cấp mật khẩu cho thuật toán sẽ TÌM HIỂU sức mạnh của nó?

Bạn đã gợi ý một số trong phần mở đầu (tấn công từ điển, v.v.). Về cơ bản, có một số thực tiễn phổ biến mà kẻ tấn công có thể đoán được, điều này làm giảm đáng kể không gian tìm kiếm. Tôi khá chắc chắn rằng thuật toán của bạn sẽ "đánh giá quá cao" như sau:

  • mọi nơi
  • Mọi nơi
  • Ở mọi nơi1

Mật khẩu khá dài, nhưng có thể bị bẻ khóa một cách tầm thường vì từ gốc xuất hiện trong từ điển cơ bản và các sửa đổi được coi là đủ phổ biến để tạo thành một phần của bất kỳ cuộc tấn công từ điển nào. Chữ cái điển hình -> chuyển đổi số (ví dụ 3v3rywh3r3) cũng nên được coi là khá yếu và bạn nên xử phạt những lỗi này.

Ở mức độ thấp hơn nhiều, các mật khẩu rắc rối khác có thể là mật khẩu rõ ràng, chẳng hạn như:

  • abcdefghijklmnop
  • abcde12345

Mặc dù những thứ này có lẽ ít có khả năng được nhắm mục tiêu trong các cuộc tấn công từ điển thực tế, nhưng chúng gặp phải các vấn đề tương tự như ví dụ "aaaaa ..." của bạn.

Tôi không chắc chắn nếu các cụm từ mật khẩu hiện đang được nhắm mục tiêu trong hầu hết các cuộc tấn công từ điển, nhưng không nghi ngờ gì khi chúng trở nên phổ biến, chúng sẽ được nhắm mục tiêu ngày càng nhiều. Tôi nghĩ rằng ví dụ xkcd nổi tiếng có tính đến điều này, vì chỉ có 11 bit được gán cho mỗi "từ chung". Thuật toán của bạn cũng đánh giá quá cao các loại mật khẩu này.

Vì vậy, để tóm tắt, thuật toán thực hiện khá tốt công việc ước tính, nhưng nó thực sự nên được xem xét về cấu trúc của mật khẩu và các mẫu phổ biến, đã biết.


Một cấp độ kiểm tra đạo hàm sẽ xác định tất cả các mẫu đó.
Wug
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.