Bir şifrenin entropisini nasıl tahmin edebilirim?


14

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 .


2
Tech.dropbox.com/?p=165 gördünüz ? Size bazı fikirler verebilir. Dl.dropbox.com/u/209/zxcvbn/test/index.html adresinde bir demo var ve kod github'da .


bir seçenek bunları bir sıkıştırma algoritması ile çalıştırmak ve ne kadar iyi sıkıştırdıklarını görmek olabilir, burada tek yakalama, çoğu sıkıştırma algosunun büyük miktarlarda verilerle çalışmak üzere tasarlanması ve küçük miktarlarda veri için bir tanesine ihtiyaç duymanızdır
jk.

1
@mouviciel: Seni yumruk atıyorum. İlk satırı okuyun: D
Wug

@Wug - Harika! Bağlantıyı takip etmedim: çeşitli kaynakların bu tür çalışmaları kapsadığını hayal edemezdim !
mouviciel

Yanıtlar:


9

NIST SP 800-63'ün p46'sındaki Ek A, birkaç bit kullanarak şifre entropisini tahmin eden Claude Shannon'ın çalışmasından bahsediyor . Aslında, bu XKCD karikatürünün entropi bitlerini hesaplamak için kullandığı belgedir. özellikle:

  • ilk karakterin entropisi 4 bit olarak alınır;
  • sonraki 7 karakterin entropisi karakter başına 2 bittir; bu Shannon'un “8 harften fazla olmayan istatistiksel etkiler düşünüldüğünde entropinin karakter başına kabaca 2,3 bit olduğu” tahminiyle kabaca tutarlıdır;
  • 9. ila 20. karakter için entropi karakter başına 1.5 bit olarak alınır;
  • 21 ve üzeri karakterler için entropi karakter başına 1 bit olarak alınır;
  • Hem büyük harf hem de alfabetik olmayan karakterler gerektiren bir kompozisyon kuralı için 6 bitlik entropi "bonusu" atanır. Bu, bu karakterlerin kullanımını zorlar, ancak çoğu durumda karakterler yalnızca parolanın başında veya sonunda gerçekleşir ve toplam arama alanını bir miktar azaltır, bu nedenle yarar muhtemelen mütevazi ve neredeyse uzunluktan bağımsızdır. parola;
  • Kapsamlı bir sözlük kontrolü için 6 bitlik entropi bonusu eklenir. Saldırgan sözlüğü biliyorsa, bu şifreleri test etmekten kaçınabilir ve her durumda sözlüğün çoğunu tahmin edebilecektir, ancak sözlük kuralı olmadığında en çok seçilen şifreler olacaktır. Varsayım, bir sözlük testi için tahmin edilen entropi faydalarının çoğunun nispeten kısa parolalara tahakkuk ettirilmesidir, çünkü hatırlanabilecek herhangi bir uzun parola mutlaka sözlük sözcüklerinden oluşan bir “parola” olmalıdır, bu nedenle bonus 20'de sıfıra düşer. karakter.

Fikir, bir kimlik doğrulama sisteminin belirli entropi düzeylerini eşik olarak seçeceğidir. Örneğin, 10 bit zayıf, 20 orta ve 30 güçlü olabilir (rakamlar, örnek olarak değil, keyfi olarak alınır, öneri değildir). Ne yazık ki, belge bu tür eşikleri önermiyor, çünkü muhtemelen kaba kuvvet veya tahmin parolalarını hesaplamak için mevcut hesaplama gücü zaman içinde artmaktadır:

Bazı keyfi özel kurallar dizisini uygulamaya alternatif olarak, bir kimlik doğrulama sistemi, yukarıda belirtilen kuralları kullanarak kullanıcı şifrelerini derecelendirebilir ve bazı minimum entropi standartlarını karşılayan herhangi bir tanesini kabul edebilir. Örneğin, en az 24 bit entropi içeren parolaların gerekli olduğunu varsayalım. Dizenin 23 karaktere sahip olduğunu ve büyük harf ve alfabetik olmayan karakterler gerektiren bir kompozisyon kuralını karşılayacağını gözlemleyerek “IamtheCapitanofthePina4” entropi tahminini hesaplayabiliriz.

Bu, aradığınız şey olabilir veya olmayabilir, ancak başka bir şey değilse, kötü bir referans noktası değildir.

[Düzenle: Aşağıdakileri ekledi.]

Büyük Açıklanmış Parolalar Setine (Matt Weir, Sudhir Aggarwal, Michael Collins ve Henry Stern tarafından) Saldırılarak Parola Oluşturma Politikaları için Kağıt Test Metrikleri , yukarıda açıklanan Shannon modelinin insan tarafından oluşturulan parolalar için doğru bir entropi modeli olmadığını gösterdi. Daha doğru teklifler için "Bölüm 5 Yeni Şifre Oluşturma Politikaları Oluşturma" konusuna bakmanızı tavsiye ederim.


3
şifre gücü hakkındaki Wikipedia makalesinde, bu kuralların insan tarafından oluşturulan şifreler için doğru olmadığı bulunmuştur.
Ryathal

1
Doğru ( ilginç bir okuma için goo.gl/YxRk ).
akton

Elbette bunun bir uyarısı var. İnsanlar tipik olduğu için belirli kurallara uyma eğiliminde olan istatistiksel olarak tipik şifreler için oldukça doğru olabilir. Bu kılavuz ilkeler, rastgele oluşturulan parolaların tipik olarak insan tarafından oluşturulan parolalardan çok daha fazla olacağı gerçeğini dikkate almayacaktır çünkü (muhtemelen) hiçbir desen ve kelime içermeyeceklerdir.
Wug

4

Bu sayfanın altındaki KeePass kaynak koduna göz atın . Sınıfının uyguladığı yerinde olmasını aradıklarını doğrultusunda gibi görünüyor oldukça güzel algoritması. Sonuçlarım şöyle:QualityEstimation

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

Bu entropiyi veya belki de bogofitness gibi başka bir metrik hesaplar mı? Ayrıca, [a ^ 36] 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'yı genişletmeyi hatırladınız değil mi?
Wug

Er, hayır, bu dizeleri aynen kopyaladım :( Tamamen özel karakterlerin harika bir şekilde kullanıldığını düşündüm, ilk bakışta bir normal ifade değil.Tekrar vereceğim ve güncelleyeceğim.İkincisi, entropinin parçalarını hesaplıyor, evet .
Jesse C. Slicer

1
Masamı 25 karakterle enfatten etmekten kaçınmak için kullandığım garip gösterim kadar düzenli bir ifade değildi
Wug

2
Bu yorumu 'enfatten' için + 1'lemek zorunda kaldım. Bu durum için mükemmel bir karalama kelimesi gibi görünüyor.
Jesse C. Slicer

1
Aslında "KeyPass" yerine "KeePass" yazılmıştır. (Sadece kendim bir düzenleme yapardım, ancak 6 karakterden fazla olmalılar ...)
Ian Dunn

1

Sen sor

Özellikle, algoritmaya bir parola beslemenin gücünü fazla aşacağı durumlar düşünülebilir mi?

Ama soruda bir örnek var. Tasarım gereği, xkcd2 ~ 44 bit entropiye sahiptir, ancak tahmininiz 160,5 bittir.


Yani, genelleme, algoritma, kelimeleri veya diğerlerinden daha çok kullanılması muhtemel olan karakter kombinasyonlarını düşünürken bozulur. Ayrıca kanonik xkcd örneğinin boşluk içermediğini ve hesaplamamın da olduğunu belirteceğim.
Wug

@Wug, bu adil bir genelleme. Bu sorunun ilk yorumunda bahsedilen zxcvbn tarafından ele alınan bir şey.
Peter Taylor

1

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?

Önsözde bazılarına ima ettiniz (sözlük saldırıları, vb.). Temel olarak, saldırganın tahmin edebileceği ve arama alanını büyük ölçüde azaltan bir dizi yaygın uygulama vardır. Algoritmanızın aşağıdakileri "fazla tahmin edeceğinden" eminim:

  • her yerde
  • Her yerde
  • Everywhere1

Parola oldukça uzundur, ancak orijinal kelime temel bir sözlükte göründüğü ve modifikasyonların herhangi bir iyi sözlük saldırısının bir parçasını oluşturacak kadar yaygın olduğu düşünüldüğünde önemsiz derecede kırılabilir. Tipik harf -> sayı dönüşümleri (yani 3v3rywh3r3) de oldukça zayıf kabul edilmelidir ve bunlar için cezalandırmalısınız.

Çok daha az derecede, diğer sorun parolaları, aşağıdaki gibi belirgin kalıplara sahip olan parolalar olabilir:

  • abcdefghijklmnop
  • ABCde12345

Bunların gerçek sözlük saldırılarında hedeflenmesi daha az olası olsa da, "aaaaa ..." örneğinizle benzer sorunlardan muzdariptirler.

Şifre ifadelerinin şu anda çoğu sözlük saldırısında hedeflenip hedeflenmediğinden emin değilim, ancak şüphe duydukları için popülerlik kazandıklarından daha fazla hedeflenecekler. Bence ünlü xkcd örneği bunu dikkate alıyor çünkü her "ortak kelime" için sadece 11 bit atandı. Algoritmanız bu tür şifreleri de fazla tahmin eder.

Özetlemek gerekirse, algoritma tahminlerde oldukça iyi bir iş çıkarıyor, ancak gerçekten parolanın yapısını ve yaygın, bilinen kalıpları göz önünde bulundurmak gerekiyor.


Bir seviye türev kontrolü tüm bu paternleri tanımlayacaktır.
Wug
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.