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.