ฉันจะประมาณค่าเอนโทรปีของรหัสผ่านได้อย่างไร


14

การอ่านแหล่งข้อมูลต่าง ๆเกี่ยวกับความแข็งแกร่งของรหัสผ่านฉันพยายามสร้างอัลกอริทึมที่จะให้การประมาณคร่าวๆว่ามีรหัสผ่านของเอนโทรปีเท่าใด

ฉันกำลังพยายามสร้างอัลกอริทึมที่ครอบคลุมมากที่สุด ณ จุดนี้ฉันมีรหัสเทียมเท่านั้น แต่อัลกอริทึมครอบคลุมสิ่งต่อไปนี้:

  • ความยาวรหัสผ่าน
  • ตัวละครซ้ำ
  • รูปแบบ (ตรรกะ)
  • ช่องว่างอักขระที่แตกต่างกัน (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<ซึ่งไม่มีคำหรือรูปแบบ


2
คุณเห็นtech.dropbox.com/?p=165หรือไม่ มันอาจให้ความคิดกับคุณ มีการสาธิตที่dl.dropbox.com/u/209/zxcvbn/test/index.htmlและรหัสอยู่บน github


ตัวเลือกหนึ่งอาจจะเรียกใช้ผ่านอัลกอริธึมการบีบอัดและดูว่ามันบีบอัดได้ดีเพียงใดที่นี่คือการบีบอัดข้อมูลส่วนใหญ่ได้รับการออกแบบให้ทำงานกับข้อมูลจำนวนมากและคุณต้องการหนึ่งสำหรับข้อมูลจำนวนเล็กน้อย
jk

1
@mouviciel: ฉันตีคุณต่อย อ่านบรรทัดแรก: D
Wug

@Wug - เยี่ยมมาก! ฉันไม่ได้ไปตามลิงค์: นึกภาพไม่ออกว่ามีแหล่งข้อมูลมากมายครอบคลุมการศึกษาแบบนั้น!
mouviciel

คำตอบ:


9

ภาคผนวก A ใน p46 ของNIST SP 800-63พูดคุยเกี่ยวกับงานของClaude Shannonผู้ประเมินรหัสผ่านเอนโทรปีโดยใช้บิตจำนวนหนึ่ง อันที่จริงนี่เป็นเอกสารที่การ์ตูน XKCD ใช้ในการคำนวณบิตเอนโทรปี โดยเฉพาะ:

  • เอนโทรปีของตัวอักษรตัวแรกจะถูกนำมาเป็น 4 บิต;
  • เอนโทรปีของอักขระ 7 ตัวถัดไปคือ 2 บิตต่ออักขระ นี่สอดคล้องกับประมาณการของแชนนอนอย่างคร่าว ๆ ว่า "เมื่อผลทางสถิติที่ขยายเกิน 8 ตัวอักษรถือว่าเป็นเอนโทรปีประมาณ 2.3 บิตต่อตัวอักษร"
  • สำหรับตัวละครที่ 9 ถึง 20 ตัวเอนโทรปีจะถูกนำมาเป็น 1.5 บิตต่อตัวอักษร;
  • สำหรับตัวละครที่ 21 และสูงกว่าเอนโทรปีจะถูกนำมาเป็น 1 บิตต่อตัวละคร;
  • “ โบนัส” จำนวน 6 บิตของเอนโทรปีถูกกำหนดไว้สำหรับกฎการแต่งเพลงที่ต้องใช้ทั้งตัวพิมพ์ใหญ่และอักขระที่ไม่ใช่ตัวอักษร สิ่งนี้บังคับให้ใช้อักขระเหล่านี้ แต่ในหลาย ๆ กรณีตัวละครของเจ้าจะเกิดขึ้นเฉพาะตอนเริ่มต้นหรือตอนท้ายของรหัสผ่านและจะลดพื้นที่การค้นหาโดยรวมบ้างดังนั้นประโยชน์อาจจะค่อนข้างปานกลางและไม่ขึ้นอยู่กับความยาวของ รหัสผ่าน
  • โบนัสของเอนโทรปีสูงสุด 6 บิตถูกเพิ่มเข้ามาเพื่อการตรวจสอบพจนานุกรมที่กว้างขวาง หากผู้โจมตีรู้จักพจนานุกรมเขาสามารถหลีกเลี่ยงการทดสอบรหัสผ่านเหล่านั้นและจะสามารถเดาได้ว่าพจนานุกรมส่วนใหญ่จะเป็นรหัสผ่านที่เลือกได้มากที่สุดในกรณีที่ไม่มีกฎของพจนานุกรม สมมติฐานคือประโยชน์ที่ได้จากเอนโทรปีที่คาดเดาได้สำหรับการทดสอบพจนานุกรมมีรหัสผ่านค่อนข้างสั้นเนื่องจากรหัสผ่านยาว ๆ ที่สามารถจำได้นั้นจะต้องเป็น "วลีวลี" ที่ประกอบด้วยคำในพจนานุกรมดังนั้นโบนัสจะลดลงเหลือศูนย์ที่ 20 ตัวละคร

แนวคิดก็คือระบบการตรวจสอบความถูกต้องจะเลือกระดับเอนโทรปีบางอย่างเป็นเกณฑ์ ตัวอย่างเช่น 10 บิตอาจจะอ่อนแอ 20 สื่อและ 30 ที่แข็งแกร่ง (ตัวเลขที่เลือกโดยพลการเป็นตัวอย่างไม่ใช่คำแนะนำ) น่าเสียดายที่เอกสารไม่แนะนำเกณฑ์ดังกล่าวอาจเป็นเพราะพลังการคำนวณที่มีอยู่เพื่อบังคับเดรัจฉานหรือเดารหัสผ่านเพิ่มขึ้นเมื่อเวลาผ่านไป:

เพื่อเป็นทางเลือกในการบังคับใช้กฎเฉพาะบางชุดระบบรับรองความถูกต้องอาจใช้รหัสผ่านของผู้ใช้โดยใช้กฎที่ระบุไว้ข้างต้นและยอมรับกฎเกณฑ์ใด ๆ ที่สอดคล้องกับมาตรฐานเอนโทรปีขั้นต่ำ ตัวอย่างเช่นสมมติว่าต้องการรหัสผ่านที่มีเอนโทรปีอย่างน้อย 24 บิต เราสามารถคำนวณการประมาณค่าเอนโทรปีของ“ IamtheCapitanofthePina4” โดยการสังเกตว่าสตริงมี 23 ตัวอักษรและจะตอบสนองกฎการแต่งเพลงที่ต้องการตัวพิมพ์ใหญ่และไม่ใช่ตัวอักษร

นี่อาจเป็นหรือไม่ใช่สิ่งที่คุณกำลังมองหา แต่ไม่ใช่จุดอ้างอิงที่ไม่ดีหากไม่มีอะไรอื่น

[แก้ไข: เพิ่มรายการต่อไปนี้]

ตัวชี้วัดการทดสอบกระดาษสำหรับนโยบายการสร้างรหัสผ่านโดยการโจมตีรหัสผ่านที่เปิดเผยจำนวนมาก (โดย Matt Weir, Sudhir Aggarwal, Michael Collins และ Henry Stern) แสดงแบบจำลอง Shannon ตามที่อธิบายไว้ข้างต้นไม่ใช่แบบจำลองเอนโทรปีสำหรับรหัสผ่านที่มนุษย์สร้างขึ้น ฉันขอแนะนำให้ดูที่ "ส่วนที่ 5 การสร้างนโยบายการสร้างรหัสผ่านใหม่" สำหรับข้อเสนอที่แม่นยำยิ่งขึ้น


3
บทความ Wikipedia เกี่ยวกับความแข็งแกร่งของรหัสผ่านระบุว่ากฎเหล่านั้นไม่ถูกต้องสำหรับรหัสผ่านที่มนุษย์สร้างขึ้น
Ryathal

1
จริง ( goo.gl/YxRkสำหรับการอ่านที่น่าสนใจ)
akton

มีข้อแม้หนึ่งข้อสำหรับหลักสูตรนี้ มันอาจจะค่อนข้างถูกต้องสำหรับรหัสผ่านทั่วไปทางสถิติซึ่งมีแนวโน้มที่จะปฏิบัติตามกฎบางอย่างเพราะคนเป็นคน แนวทางเหล่านี้จะไม่คำนึงถึงความจริงที่ว่ารหัสผ่านที่สร้างแบบสุ่มจะไกลกว่าคนที่สร้างขึ้นในความยาวปกติเพราะพวกเขาจะ (อาจ) มีรูปแบบไม่มีและไม่มีคำ
Wug

4

ลองดูซอร์สโค้ดของKeePassที่ด้านล่างของหน้านี้ 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

สิ่งนี้คำนวณเอนโทรปีหรือตัวชี้วัดอื่น ๆ เช่นบางที bogofitness หรือไม่? คุณจำได้ไหมที่จะขยาย [a ^ 36] เป็น 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ใช่ไหม?
Wug

เอ่อไม่ฉันคัดลอกข้อความเหล่านั้นเป็นคำต่อคำ :( ฉันคิดว่ามันเป็นการใช้ตัวละครพิเศษอย่างยอดเยี่ยมไม่ใช่ regex ในตอนแรกฉันจะให้มันอีกครั้งและอัปเดตมันประการที่สองมันคำนวณบิตของเอนโทรปีใช่ .
Jesse C. Slicer

1
มันไม่ได้แสดงออกอะไรมากมายเหมือนปกติเพราะเป็นสัญกรณ์แปลก ๆ ที่ฉันเคยหลีกเลี่ยงที่จะจัดโต๊ะให้มี 25 ตัวอักษร
Wug

2
ฉันต้อง +1 ความคิดเห็นสำหรับ 'enfatten' ดูเหมือนจะเป็นคำที่สมบูรณ์แบบสำหรับสถานการณ์นี้
Jesse C. Slicer

1
จริงๆแล้วมันสะกดว่า "KeePass" แทนที่จะเป็น "KeyPass" (ฉันต้องการเพียงแค่ทำการแก้ไขตัวเอง แต่พวกเขาจะต้องมากกว่า 6 ตัวอักษร ... )
เอียนดันน์

1

คุณถาม

ทุกคนสามารถนึกถึงสถานการณ์ที่การป้อนรหัสผ่านไปยังอัลกอริทึมจะทำให้ความแข็งแกร่งของรหัสผ่านเกินความคาดหมายได้หรือไม่?

แต่คุณมีตัวอย่างในคำถาม จากการออกแบบ xkcd2 มีเอนโทรปี ~ 44 บิต แต่ค่าประมาณของคุณคือ 160.5 บิต


ดังนั้นการวางนัยทั่วไปอัลกอริทึมจะหยุดพักเมื่อพิจารณาคำหรือชุดของตัวละครที่มีแนวโน้มที่จะใช้มากกว่าคนอื่น ๆ ฉันจะชี้ให้เห็นว่าตัวอย่าง xkcd มาตรฐานของแคนนอนไม่รวมช่องว่างและการคำนวณของฉัน
Wug

@Wug นั่นเป็นลักษณะทั่วไปที่ยุติธรรม มันเป็นสิ่งที่ถูกจัดการโดย zxcvbn ซึ่งถูกกล่าวถึงในความคิดเห็นแรกของคำถามนี้
Peter Taylor

1

ทุกคนสามารถให้ข้อมูลเชิงลึกเกี่ยวกับอัลกอริทึมนี้ที่อ่อนแอ ทุกคนสามารถนึกถึงสถานการณ์ที่การป้อนรหัสผ่านไปยังอัลกอริทึมจะทำให้ความแข็งแกร่งของรหัสผ่านเกินความคาดหมายได้หรือไม่?

คุณได้บอกใบ้ให้ทราบล่วงหน้าในการเริ่มนำ (การโจมตีด้วยพจนานุกรม ฯลฯ ) โดยพื้นฐานแล้วมีวิธีปฏิบัติทั่วไปจำนวนหนึ่งที่ผู้โจมตีสามารถคาดเดาได้ซึ่งช่วยลดพื้นที่การค้นหาลงได้อย่างมาก ฉันค่อนข้างมั่นใจว่าอัลกอริทึมของคุณจะ "ประเมินค่าสูงไป" ดังต่อไปนี้:

  • ทุกที่
  • ทุกที่
  • Everywhere1

รหัสผ่านค่อนข้างยาว แต่สามารถถอดรหัสได้เล็กน้อยเนื่องจากคำดั้งเดิมปรากฏในพจนานุกรมพื้นฐานและการดัดแปลงนั้นถือว่าเป็นเรื่องปกติพอที่จะเป็นส่วนหนึ่งของการโจมตีพจนานุกรมที่เหมาะสม ตัวอักษรทั่วไป -> การแปลงตัวเลข (เช่น 3v3rywh3r3) ควรได้รับการพิจารณาว่าอ่อนแอเช่นกันและคุณควรลงโทษสำหรับสิ่งเหล่านี้

ในระดับที่น้อยกว่ามากรหัสผ่านปัญหาอื่น ๆ อาจเป็นรหัสผ่านที่มีรูปแบบที่ชัดเจนเช่น:

  • Àbçdéfghījklmñøp
  • ABCde12345

แม้ว่าสิ่งเหล่านี้มีแนวโน้มที่จะถูกกำหนดเป้าหมายน้อยลงในการโจมตีพจนานุกรมจริง แต่พวกเขาประสบปัญหาคล้ายกันกับตัวอย่าง "aaaaa ... " ของคุณ

ฉันไม่แน่ใจว่าวลีรหัสผ่านมีการกำหนดเป้าหมายในการโจมตีพจนานุกรมส่วนใหญ่ แต่ไม่ต้องสงสัยเลยว่าพวกเขาได้รับความนิยมพวกเขาจะถูกกำหนดเป้าหมายมากขึ้นเรื่อย ๆ ฉันคิดว่าตัวอย่าง xkcd ที่มีชื่อเสียงคำนึงถึงสิ่งนี้เนื่องจากมีเพียง 11 บิตเท่านั้นที่ได้รับมอบหมายสำหรับ "คำทั่วไป" แต่ละคำ อัลกอริทึมของคุณประเมินค่ารหัสผ่านประเภทนี้เช่นกัน

ดังนั้นเพื่อสรุปอัลกอริทึมทำงานได้ค่อนข้างดีในการประมาณค่า แต่มันควรพิจารณาโครงสร้างของรหัสผ่านและรูปแบบทั่วไปที่รู้จักกันดี


การตรวจสอบอนุพันธ์ระดับหนึ่งจะระบุรูปแบบเหล่านั้นทั้งหมด
Wug
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.