ทำไมรหัสผ่านแบบสุ่มนี้ถูกตั้งค่าสถานะว่ามันง่ายเกินไป / เป็นระบบ?


37

สตริงสุ่มM1uG*xgRCthKWwjIjWc*010iSthY9bucถูกตรวจพบว่าง่ายเกินไป / เป็นระบบสำหรับรหัสผ่านตามpasswdและcracklib-checkอย่างไร ลองใช้กับเครื่องของคุณแล้วดู

echo "M1uG*xgRCthKWwjIjWc*010iSthY9buc" | cracklib-check

โปรดทราบว่านี่ไม่ใช่รหัสผ่านของฉัน แต่สตริงอื่นที่สร้างแบบสุ่มจากตัวสร้างรหัสผ่านแบบสุ่มเดียวกันที่สร้างผลลัพธ์เดียวกัน


3
มันบอกว่าM1uG*xgRCthKWwjIjWc*010iSthY9buc: OK
rici

ปรากฎว่ามีเพียงบางเวอร์ชั่นเท่านั้นที่ตรวจพบสิ่งนี้ได้ง่าย ดูคำตอบของ slm สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
BeowulfNode42

ทำไมคุณไม่ใช้/dev/urandomเพื่อสร้างรหัสผ่านแทน?
devnull

@devnull - ไม่แน่ใจว่าคุณมีในใจ แต่เพิ่ม 2 วิธีใน A ของฉันเกี่ยวกับวิธีสร้างรหัสผ่าน
slm

คำตอบ:


59

ตั้งแต่ cracklib เปิดแหล่งที่มาคำตอบที่สามารถพบได้ในรหัสที่มา

"เกินไปง่าย / เป็นระบบ" หมายความว่ามีอักขระมากเกินไปที่นำหน้าโดยหนึ่งในเพื่อนบ้านของตัวอักษร ดังนั้น "ab" หรือ "ba" จึงถือว่าไม่ดี แต่ "ac" หรือ "ca" นั้นก็โอเคตั้งแต่ b ถูกละไว้

ก่อนแพทช์นี้จาก 2010-03-02จะอนุญาตให้มีอักขระได้ไม่เกินสี่ตัวที่แสดงลักษณะนี้ เช่น "bar12345" จะล้มเหลวเนื่องจากอักขระ "a", "2", "3", "4" และ "5" เป็นเพื่อนบ้านของตัวอักษรของอักขระก่อนหน้า

slm พบในคำตอบของเขาที่M1uG*xgRCthKWwjIjWc*010iSตกลงในขณะที่M1uG*xgRCthKWwjIjWc*010iStไม่ มาวิเคราะห์กัน นี่คือตัวละครที่ cracklib-check คิดว่าเป็นตัวบ่งชี้ถึงรหัสผ่านที่เป็นระบบ:

M1uG*xgRCthKWwjIjWc*010iS
               ^^    ^^

ซึ่งอยู่ต่ำกว่าค่าสูงสุดของสี่ แต่เพิ่ม t:

M1uG*xgRCthKWwjIjWc*010iSt
               ^^    ^^  ^

ดันเกินขีด จำกัด เนื่องจาก T ตาม S (ปรากฏว่าการทดสอบไม่คำนึงถึงขนาดตัวพิมพ์)

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


1
ไม่ควร 010 นับเป็น 3 แล้ว? คำตอบที่ดีแม้ว่า
John V.

1
คำตอบที่ดีและขอขอบคุณสำหรับการให้รหัสแหล่งที่แตกต่างกัน มีเหตุผลใดที่ไฟล์นี้เรียกว่า fascist.c?
เรน

@ this.lau_ - ฉันคาดเดา: en.wikipedia.org/wiki/Fascism
SLM

ค่อนข้างตลกที่จะพูดถึง "เล็กกว่า" และ "ใหญ่กว่า" ในส่วนที่เกี่ยวกับตัวละครไม่ใช่เหรอ? ถึงแม้ว่าฉันรู้ว่ามันเกี่ยวกับค่า ASCII แต่มันอาจไม่ชัดเจนเกินไป - ดังนั้นทำไมไม่อธิบายมันให้เป็นวิธีที่ง่ายกว่านี้? ไม่มีตัวละครที่จะต้องตามมาด้วยเพื่อนบ้านโดยตรงหรือบรรพบุรุษของมัน ดังนั้นไม่อนุญาตให้ "ab" หรือ "ba" แต่จะใช้ "ac" หรือ "ca" เนื่องจาก b ถูกละไว้
ไวยากรณ์

มีเหตุผลทำไมมันไม่สามารถเล็กกว่าหรือสูงกว่า แต่มันสามารถเหมือนกัน ( Ww)?
Jeroen Vannevel

31

ใน Fedora 19

เมื่อฉันเรียกใช้ฉันได้รับตกลง ฉันอยู่ที่ Fedora 19

$ echo 'M1uG*xgRCthKWwjIjWc*010iSthY9buc' | cracklib-check
M1uG*xgRCthKWwjIjWc*010iSthY9buc: OK

นี่คือข้อมูลรุ่น:

$ rpm -qfi /usr/sbin/cracklib-check | grep -E "Version|Release"
Version     : 2.8.22
Release     : 3.fc19

หมายเหตุ:ฉันจะลองด้วยคำพูดเดียวแทนที่จะเป็น qutoes สองครั้งด้วยเนื่องจากคุณกำลังติดต่อกับ*พวกเขาพวกเขาอาจจะขยายไปในทางที่แปลกสำหรับคุณ

CentOS 5 และ 6

การลองใช้ตัวอย่างของคุณบน CentOS 6 นั้นใช้ได้ แต่ก็ไม่สำเร็จตามที่คุณอธิบายไว้ใน CentOS 5.9

$ echo 'M1uG*xgRCthKWwjIjWc*010iSthY9buc' | cracklib-check
M1uG*xgRCthKWwjIjWc*010iSthY9buc: it is too simplistic/systematic

ข้อมูลรุ่น:

$ rpm -qfi /usr/sbin/cracklib-check | grep -E "Version|Release"
Version     : 2.8.9                  
Release     : 3.3

แมลง?

สิ่งที่คุณพบเจอจะเป็นข้อผิดพลาด ถ้าคุณใช้สายของคุณและเรียกใช้มากขึ้นของสตริงของคุณเป็นcracklib-checkคุณจะพบว่าเมื่อคุณได้รับกับตัวละครที่ 26 ก็จะเริ่มที่จะล้มเหลว:

# 25    
$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iS"
M1uG*xgRCthKWwjIjWc*010iS: OK

# 26
$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iSt"
M1uG*xgRCthKWwjIjWc*010iSt: it is too simplistic/systematic

ขุดลึกลงไปในเรื่องนี้ถ้าฉันเปลี่ยนตัวละครตัวสุดท้ายจาก a tเพื่อบอกว่าvมันยังใช้งานได้

$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iSvhY9b"
M1uG*xgRCthKWwjIjWc*010iSvhY9b: OK

ดังนั้นก็จะดูเหมือนว่าในรุ่นของจะได้รับการแขวนบนอักขระย่อยcracklib-checkSth

มีบางอย่างแปลก ๆ เกี่ยวกับชิ้นส่วนของสตริงที่คุณให้ไว้ ถ้าฉันเอาส่วนท้ายและตัดส่วนหน้าฉันจะทำให้ส่วนนี้ล้มเหลวได้เช่นกัน

$ cracklib-check <<<"jIjc*010Sth"
jIjc*010Sth: it is too simplistic/systematic

สตริงเดียวกันนี้ทำให้เกิดปัญหากับ Fedora 19 และ CentOS 6 ด้วย!

อัปเดต # 1

จากความรู้ที่ดีมากของ @ waxwingตอนนี้เรารู้แล้วว่าฮิวริสติกที่ใช้ถูกเพิ่มขึ้นหากมีมากกว่า 4 ตัวอักษรที่อยู่ติดกัน มีการแนะนำโปรแกรมแก้ไขที่เปลี่ยนการเรียนรู้นี้เพื่อให้พิจารณาความยาวโดยรวมของรหัสผ่านภายใต้การพิจารณาเพื่อกำจัดผลบวกปลอมเหล่านี้

สรุปผลการวิจัย?

จากการทดสอบที่ จำกัด ของฉันดูเหมือนว่าจะมีการวิเคราะห์พฤติกรรมแปลก ๆ ที่นี่ สายบางอย่างที่ดูเหมือนจะไม่เป็นไรกำลังสะดุดมัน

ถ้าคุณกำลังพยายามที่จะประมวลนี้ฉันขอแนะนำให้ห่อรุ่นและการประเมินผลของรหัสผ่านแล้วหมดออกจากวงเมื่อรหัสผ่านที่ได้รับการสร้างขึ้นที่ cracklib-checkappeases

หรืออย่างน้อยที่สุดฉันขอแนะนำให้อัพเกรดเป็นเวอร์ชั่นใหม่กว่าซึ่งรวมถึงการแก้ไขที่ @maxwing กล่าวถึงในคำตอบของเขา

ทางเลือก Gen รหัสผ่าน

pwgen

ฉันจะเพิ่มว่าฉันมักจะใช้pwgenเพื่อสร้างรหัสผ่าน นั่นอาจเป็นประโยชน์กับคุณที่นี่เช่นกัน

$ pwgen -1cny 32
iWu0iPh8aena9raSoh{v6me)eh:eu6Ei
urandom

นอกจากนี้คุณยังสามารถใช้เวทมนตร์สคริปต์เล็ก ๆ ที่มีtr, /dev/urandomและfoldจะได้รับรหัสผ่านแบบสุ่มที่มีคุณภาพสูงมาก

$ tr -dc '[:graph:]' </dev/urandom | fold -w 32 | head -n 1
;>$7\`Hl$=zn}R.b3h/uf7mY54xp}zSF

foldคำสั่งสามารถควบคุมความยาว คุณสามารถทำสิ่งนี้แทน:

$ echo $(tr -dc '[:graph:]' </dev/urandom | head -c 32)
/_U>s[#_eLKAl(mrE@oo%X~/pcg$6-kr

ฉันใช้งานบน CentOS 5.5 ด้วย cracklib-2.8.9-3.1.src.rpm ในทั้งสองกรณีแม้ว่าการสุ่มตัวอย่างสตริงที่ยาวเช่นนี้จะง่ายเกินไปได้อย่างไร
BeowulfNode42

@ BeowulfNode42 - ไม่ใช่ ดูเหมือนว่าคุณจะพบข้อบกพร่องหรืออย่างน้อยก็มีข้อ จำกัด ของการใช้งาน
slm

แปลก. แต่สตริงเช่นTm7U:n=@*+4$*gf$6hOngEHJ;mnh$+R6นั้นก็โอเคอย่างสมบูรณ์ในเครื่องเดียวกัน
BeowulfNode42

1
เครื่องหมายคำพูดคู่จะป้องกันการขยายตัวของ glob ราคาเดียวยังคงเป็นความคิดที่ดี แต่ในกรณีสตริงมีสัญญาณดอลลาร์ backticks ฯลฯ
เดนนิส

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