sql: วิธีทดสอบความแข็งแกร่งของรหัสผ่าน [ปิด]

จะทดสอบความแข็งแกร่งของรหัสผ่านโดยใช้ SQL ได้อย่างไร?

ฉันมีตารางแบบเดิมที่มีรหัสผ่าน และฉันต้องตรวจสอบความแข็งแกร่งของรหัสผ่านทดสอบใน SSMS สักครั้งแล้วแก้ไขให้ถูกต้อง

ข้อกำหนดสำหรับระบบปัจจุบันคือ:

  1. อักขระตัวพิมพ์เล็กอย่างน้อย 2 ตัว ( abcdefg ... )
  2. อักขระตัวพิมพ์ใหญ่อย่างน้อย 2 ตัว ( ABCDEFG ... )
  3. อย่างน้อย 2 หมายเลข ( 123456 ... )
  4. อักขระเสริมอย่างน้อย 2 ตัว ( ~!@#$%^& ... )
  5. ความยาวขั้นต่ำจะต้องเป็น 8 ตัวอักษร

ขอบคุณ


person armen    schedule 12.02.2014    source แหล่งที่มา
comment
ตรวจสอบในส่วนหน้า   -  person Linga    schedule 12.02.2014
comment
ไม่มีส่วนหน้าสำหรับกรณีนี้   -  person armen    schedule 12.02.2014
comment
และมันควรจะทำงานอย่างไรในทางทฤษฎี?   -  person Alexander    schedule 12.02.2014
comment
หากไม่มีส่วนหน้า แล้วถ้าเกณฑ์ที่คุณระบุไว้ข้างต้นไม่เป็นไปตามเกณฑ์ล่ะ ฉันหมายถึงสิ่งที่คุณพยายามทำให้สำเร็จ ??   -  person Krishnraj Rana    schedule 12.02.2014
comment
มีตารางเก่าที่มีรหัสผ่าน และฉันจำเป็นต้องตรวจสอบความแข็งแกร่งของรหัสผ่านทดสอบใน SSMS สักครั้งแล้วแก้ไขให้ถูกต้อง   -  person armen    schedule 12.02.2014
comment
เหตุใดคำถามนี้จึงถูกระงับ? คำถามนั้นง่ายมาก และไม่ต้องการข้อมูลเพิ่มเติม สามารถเปลี่ยนคำใหม่เป็น: คุณจะใช้ SQL เพื่อตรวจสอบคอลัมน์ varchar สำหรับข้อกำหนดต่อไปนี้ได้อย่างไร ... ? ดูคำตอบของฉันด้านล่าง   -  person Dan    schedule 12.02.2014
comment
@ling.s, OGHaza, DontVoteMeDown, Mario และ Saurabh - เกิดอะไรขึ้นกับคำถามของฉันกันแน่? คุณไม่เข้าใจอะไรจากคำถามที่ให้มา ช่วยฉันเข้าใจสิ่งที่ฉันทำผิด! อย่างที่คุณเห็นคำถามของฉันได้รับคำตอบแล้ว นี่คือการแสดงอำนาจบางอย่างใช่ไหม? โปรดอย่าลืมว่า stackoverflow เกี่ยวกับอะไร!   -  person armen    schedule 13.02.2014


คำตอบ (1)


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

แต่ถ้าคุณต้องทำโดยใช้ SQL จริงๆ สิ่งนี้น่าจะนำคุณไปในทิศทางที่ถูกต้อง:

SELECT Password,
    CASE WHEN 
        Password COLLATE Latin1_General_BIN LIKE '%[a-z]%[a-z]%' AND
        Password COLLATE Latin1_General_BIN LIKE '%[A-Z]%[A-Z]%' AND
        Password LIKE '%[0-9]%[0-9]%' AND
        Password LIKE '%[~!@#$%^&]%[~!@#$%^&]%' AND
        LEN(Password) >= 8
    THEN 1 ELSE 0 END AS Valid
FROM TableWithPasswords

คอลัมน์ "ถูกต้อง" จะมี 1 หากรหัสผ่านตรงตามเกณฑ์ของคำสั่ง CASE มิฉะนั้นจะเป็น 0 หากคุณต้องการเพิ่มอักขระพิเศษเพิ่มเติมให้กับข้อกำหนดที่ 4 อย่าลืมใช้อักขระหลีกอย่างเหมาะสม ตามนี้: http://technet.microsoft.com/en-us/library/ms179859.aspx

โปรดสังเกตคำสั่ง COLLATE - เพื่อให้แน่ใจว่ามีการเปรียบเทียบแบบคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่สำหรับตัวดำเนินการ LIKE

person Dan    schedule 12.02.2014
comment
ใกล้มาก แต่ '11aAAA##' ต้องส่งคืน 0 แทนที่จะเป็น 1 (อักขระตัวพิมพ์เล็กหนึ่งตัวแทนที่จะเป็น 2+) COLLATE Latin1_General_CS_AS ท้ายที่สุดก็ทำให้ฉันมีข้อผิดพลาด (ไวยากรณ์ไม่ถูกต้องใกล้กับคำหลัก 'COLLATE' ) - person armen; 12.02.2014
comment
ฉันแก้ไขโพสต์ของฉันแล้ว โปรดลองอีกครั้งได้ไหม ในครั้งนี้ คำสั่ง COLLATE ควรตรวจสอบให้แน่ใจว่าการเปรียบเทียบแต่ละรายการคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดังนั้น '11aAAA##' ควรส่งคืน 0 เนื่องจากการเปรียบเทียบครั้งแรกจะเป็นเท็จ - person Dan; 12.02.2014
comment
ฉันพยายามแล้ว แต่ก็ยังทำงานไม่ถูกต้อง '11aAAA##' ยังคงส่งคืน 1 คุณสามารถตรวจสอบได้ที่นี่: sqlfiddle.com/#!6 /b11c0/1 - person armen; 12.02.2014
comment
ตามโพสต์นี้ คุณอาจต้อง เปลี่ยนการจัดเรียงเป็น Latin1_General_BIN ฉันแก้ไขโพสต์ของฉันแล้ว sqlfiddle.com/#!6/b11c0/2 - person Dan; 12.02.2014