Parola gücü hakkında çeşitli kaynakları okumak zorunda Ben bir parola ne kadar entropi kaba bir tahmin sağlayacak bir algoritma oluşturmaya çalışıyorum.
Mümkün olduğunca kapsamlı bir algoritma oluşturmaya çalışıyorum. Bu noktada sadece sahte kod var, ancak algoritma aşağıdakileri kapsar:
- şifre uzunluğu
- tekrarlanan karakterler
- kalıplar (mantıksal)
- farklı karakter uzayları (LC, UC, Sayısal, Özel, Genişletilmiş)
- sözlük saldırıları
Aşağıdakileri kapsamamaktadır ve iyi örtülmelidir (mükemmel olmasa da):
- sıralama (şifreler kesinlikle bu algoritmanın çıktısı ile sipariş edilebilir)
- kalıplar (mekansal)
Herkes bu algoritmanın neye zayıf olabileceği konusunda fikir verebilir mi? Özellikle, algoritmaya bir parola beslemenin gücünü fazla aşacağı durumlar düşünülebilir mi? Düşük tahminler daha az sorun yaratır.
Algoritma:
// 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)
Birkaç giriş ve bunların istenen ve gerçek entropy_bits çıkışları:
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"
Algoritma (doğru), alfabe boyutunu artırmanın (bir basamakla bile), her ikisini de 36 a'dan oluşan 6. ve 7. şifreler için entropy_bits arasındaki farkın gösterdiği gibi, uzun şifreleri büyük ölçüde güçlendirdiğini, ancak ikincisinin 21'inci harfle. Bununla birlikte, 36 a'lık bir parolaya sahip olmanın iyi bir fikir olmadığını, zayıf bir şifre kırıcının (ve sizi yazdığını izleyen herkesin göreceğini) kolayca kırıldığını ve algoritmanın bunu yansıtmadığını hesaba katmazlar. .
Bununla birlikte, xkcd1'in, daha fazla karmaşıklık yoğunluğuna sahip olmasına rağmen, xkcd2'ye kıyasla zayıf bir şifre olduğu gerçeğini yansıtmaktadır (bu bir şey mi?).
Bu algoritmayı nasıl geliştirebilirim?
Zeyilname 1
Sözlük saldırıları ve kalıp tabanlı saldırılar büyük bir şey gibi görünüyor, bu yüzden bunlara değinmek için bir bıçak alacağım.
Bir kelime listesinden kelimeler için kapsamlı bir arama yapabilir ve kelimeleri temsil ettikleri kelimelere özgü jetonlarla değiştirebilirim. Word tokenları daha sonra karakter olarak ele alınacak ve kendi ağırlık sistemlerine sahip olacak ve parolalara kendi ağırlıklarını ekleyecektir. Birkaç yeni algoritma parametresine ihtiyacım var (onları lw, Nw ~ = 2 ^ 11, fw ~ = .5 ve rfw olarak adlandıracağım) ve diğerlerinden herhangi biri gibi parolaya ağırlık koyarım ağırlıklar.
Bu kelime araması, E ile 3'teki gibi ortak karakter ikamelerinin yanı sıra, hem küçük hem de büyük harflerle eşleşecek şekilde özel olarak değiştirilebilir. veya kelime başına iki tane, ki bu tamam. Aksi halde, mükemmel olmayan her karakter eşleşmesi için kelimeye bir miktar bonus vermek genel bir kuraldır.
Daha sonra, 'aaaaa' ve '12345' gibi desenleri tanımlayacak ve algılanan her bir deseni bir desenle değiştirecek tekrarlanan karakterler ve türev testleri (her karakter arasındaki farkı alır) aramaları gibi basit desen kontrolleri yapabilirim. desen ve uzunluğa özgü belirteç. Algoritmik parametreler (özellikle, model başına entropi), desene dayalı olarak anında oluşturulabilir.
Bu noktada, şifrenin uzunluğunu alırdım. Her kelime jetonu ve desen jetonu bir karakter olarak sayılır; her jeton sembolik olarak temsil ettikleri karakterlerin yerine geçer.
Bir çeşit desen gösterimi oluşturdum, ancak desen uzunluğu l, desen sırası o ve taban elemanı b'yi içeriyor. Bu bilgi, her bir model için rastgele bir ağırlık hesaplamak için kullanılabilir. Gerçek kodda daha iyi bir şey yapardım.
Değiştirilmiş Örnek:
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
Entropinin kalıplardan nasıl hesaplandığının tam semantiği tartışmaya açıktır. Şöyle bir şey düşünüyordum:
entropy(b) * l * (o + 1) // o will be either zero or one
Değiştirilmiş algoritma s^fU¬5ü;y34G<
, hiçbir kelime veya desen içermeyen istisna olmak üzere, orijinal tablodaki her parolanın kusurlarını bulur ve gücünü azaltır .