การอ่านแหล่งข้อมูลต่าง ๆเกี่ยวกับความแข็งแกร่งของรหัสผ่านฉันพยายามสร้างอัลกอริทึมที่จะให้การประมาณคร่าวๆว่ามีรหัสผ่านของเอนโทรปีเท่าใด
ฉันกำลังพยายามสร้างอัลกอริทึมที่ครอบคลุมมากที่สุด ณ จุดนี้ฉันมีรหัสเทียมเท่านั้น แต่อัลกอริทึมครอบคลุมสิ่งต่อไปนี้:
- ความยาวรหัสผ่าน
- ตัวละครซ้ำ
- รูปแบบ (ตรรกะ)
- ช่องว่างอักขระที่แตกต่างกัน (LC, UC, ตัวเลข, พิเศษ, ขยาย)
- การโจมตีพจนานุกรม
ไม่ครอบคลุมถึงสิ่งต่อไปนี้และควรครอบคลุมด้วย (แต่ไม่สมบูรณ์):
- การสั่งซื้อ (สามารถสั่งรหัสผ่านอย่างเข้มงวดโดยเอาท์พุทของอัลกอริทึมนี้)
- รูปแบบ (อวกาศ)
ทุกคนสามารถให้ข้อมูลเชิงลึกเกี่ยวกับอัลกอริทึมนี้ที่อ่อนแอ โดยเฉพาะทุกคนสามารถคิดว่าสถานการณ์ที่ให้อาหารรหัสผ่านเพื่ออัลกอริทึมจะประเมินค่าสูงความแข็งแรงของตนหรือไม่ การประเมินต่ำกว่าประเด็นมีน้อย
อัลกอริทึม:
// 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)
อินพุตสองสามตัวและผลลัพธ์ entropy_bits ที่ต้องการและแท้จริง:
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"
อัลกอริทึมนั้นตระหนักได้อย่างถูกต้องว่าการเพิ่มขนาดตัวอักษร (แม้จะเป็นเลขตัวเดียว) จะทำให้รหัสผ่านที่มีความยาวเพิ่มขึ้นอย่างมากมายดังที่แสดงโดยความแตกต่างของ entropy_bits สำหรับรหัสผ่านที่ 6 และ 7 ซึ่งทั้ง 36 ประกอบด้วย 36 a พิมพ์ใหญ่ อย่างไรก็ตามพวกเขาไม่ได้คำนึงถึงความจริงที่ว่ารหัสผ่านของ 36 a นั้นไม่ใช่ความคิดที่ดีมันแตกง่ายด้วยแครกเกอร์รหัสผ่านที่อ่อนแอ (และใครก็ตามที่ดูคุณพิมพ์จะเห็นมัน) และอัลกอริทึมไม่ได้สะท้อนว่า .
อย่างไรก็ตามมันสะท้อนให้เห็นถึงความจริงที่ว่า xkcd1 เป็นรหัสผ่านที่อ่อนแอเมื่อเทียบกับ xkcd2 แม้ว่าจะมีความซับซ้อนที่ซับซ้อนมากขึ้น
ฉันจะปรับปรุงอัลกอริทึมนี้ได้อย่างไร
ภาคผนวก 1
การโจมตีด้วยพจนานุกรมและการโจมตีตามรูปแบบดูเหมือนจะเป็นเรื่องใหญ่ดังนั้นฉันจะเอาการแทงไปจัดการกับสิ่งเหล่านั้น
ฉันสามารถทำการค้นหาที่ครอบคลุมผ่านรหัสผ่านสำหรับคำจากรายการคำและแทนที่คำด้วยโทเค็นที่ไม่ซ้ำกับคำที่พวกเขาเป็นตัวแทน โทเค็น Word จะถือว่าเป็นอักขระและมีระบบน้ำหนักของตนเองและจะเพิ่มน้ำหนักของตนเองในรหัสผ่าน ฉันต้องการพารามิเตอร์อัลกอริธึมใหม่สองสามอัน (ฉันจะเรียกพวกมันว่า lw, Nw ~ = 2 ^ 11, fw ~ = .5 และ rfw) และฉันจะแยกน้ำหนักเป็นรหัสผ่านเหมือนกับที่ฉันต้องการ น้ำหนัก
การค้นหาคำนี้สามารถแก้ไขเป็นพิเศษเพื่อให้ตรงกับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เช่นเดียวกับการเปลี่ยนตัวอักขระทั่วไปเช่นเดียวกับ E กับ 3 หากฉันไม่ได้เพิ่มน้ำหนักให้กับคำที่ตรงกันเช่นนั้นอัลกอริทึมจะประเมินความแข็งแกร่งของพวกเขาเล็กน้อย หรือสองต่อคำซึ่งก็โอเค มิฉะนั้นกฎทั่วไปจะเป็นสำหรับการจับคู่อักขระที่ไม่สมบูรณ์แต่ละครั้งให้คำว่าโบนัสเล็กน้อย
ฉันสามารถทำการตรวจสอบรูปแบบง่าย ๆ เช่นการค้นหาการทำงานของตัวละครซ้ำและการทดสอบอนุพันธ์ (รับความแตกต่างระหว่างตัวละครแต่ละตัว) ซึ่งจะระบุรูปแบบเช่น 'aaaaa' และ '12345' และแทนที่รูปแบบที่ตรวจพบแต่ละรูปแบบด้วยรูปแบบ โทเค็นเฉพาะรูปแบบและความยาว พารามิเตอร์อัลกอริทึม (โดยเฉพาะเอนโทรปีต่อรูปแบบ) สามารถสร้างขึ้นได้ทันทีตามรูปแบบ
ณ จุดนี้ฉันจะใช้ความยาวของรหัสผ่าน โทเค็นคำแต่ละคำและโทเค็นลวดลายจะนับเป็นอักขระตัวเดียว โทเค็นแต่ละอันจะแทนที่อักขระที่เป็นสัญลักษณ์
ฉันสร้างสัญกรณ์รูปแบบบางรูปแบบ แต่มันรวมถึงความยาวของรูปแบบ l ลำดับของรูปแบบ o และองค์ประกอบพื้นฐาน b ข้อมูลนี้สามารถใช้ในการคำนวณน้ำหนักโดยพลการสำหรับแต่ละรูปแบบ ฉันจะทำสิ่งที่ดีกว่าในรหัสจริง
ตัวอย่างดัดแปลง:
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
ความหมายที่แท้จริงของวิธีการคำนวณเอนโทรปีจากรูปแบบขึ้นสำหรับการสนทนา ฉันกำลังคิดบางอย่างเช่น:
entropy(b) * l * (o + 1) // o will be either zero or one
อัลกอริทึมที่ปรับเปลี่ยนจะพบข้อบกพร่องด้วยและลดความแข็งแรงของรหัสผ่านแต่ละตัวในตารางต้นฉบับยกเว้นs^fU¬5ü;y34G<
ซึ่งไม่มีคำหรือรูปแบบ