Linux รู้ได้อย่างไรว่ารหัสผ่านใหม่คล้ายกับรหัสผ่านก่อนหน้า


144

สองสามครั้งที่ฉันพยายามเปลี่ยนรหัสผ่านผู้ใช้บนเครื่อง Linux ต่างๆและเมื่อรหัสผ่านใหม่คล้ายกับรหัสเก่าระบบปฏิบัติการบ่นว่าพวกเขาคล้ายกันเกินไป

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


30
ก่อนอื่น: ข้อความธรรมดา? ไม่ หาก (!) บันทึกไว้คุณบันทึกแฮชและเปรียบเทียบแฮช ใน Linux แม้ว่าจะตรวจสอบรหัสผ่านปัจจุบันด้วยรหัสผ่านใหม่ ผู้ใช้จะได้รับทั้งเมื่อเปลี่ยนรหัสผ่าน
Rinzwind

42
@Rinzwind แต่ hashes เปรียบเทียบจะไม่ทำงานเพราะความแตกต่างที่ตัวละครตัวหนึ่งจะส่งผลให้กัญชาแตกต่างอย่างสิ้นเชิง
slhck

17
ดูเพิ่มเติมFacebook เก็บรหัสผ่านแบบข้อความธรรมดาหรือไม่ เกี่ยวกับความปลอดภัยของข้อมูลสำหรับวิธีอื่น ๆ ในการตรวจสอบความคล้ายคลึงกันที่ให้เฉพาะแฮชของรหัสผ่านเก่าและข้อความธรรมดาของรหัสผ่านใหม่ (ไม่มีข้อความธรรมดาสำหรับเก่า)
บ๊อบ

21
คุณสามารถทดสอบความคล้ายคลึงกันระหว่างรหัสผ่านเก่าที่ถูกแฮชและรหัสผ่านใหม่แบบธรรมดาได้ เพียงสร้างรายการรหัสผ่านที่คล้ายกับรหัสผ่านใหม่แฮชรหัสทั้งหมดและเปรียบเทียบแฮชที่ได้กับแฮชของรหัสผ่านเก่า หากการแข่งขันใด ๆ มันก็คล้ายกัน
BWG

2
@BWG: นั่นเป็นเรื่องเล็กน้อยมาก - แผนการแฮชปัจจุบันทำแฮชดังนั้นก่อนอื่นคุณต้องแยกเกลือออกจากแฮชรหัสผ่านเก่าและตรวจสอบให้แน่ใจว่าคุณใช้เกลือนั้นสำหรับรหัสผ่านที่คล้ายกับใหม่ของคุณ (ฉันกำลังชี้ให้เห็นสิ่งนี้เพราะเป็นไปได้ว่า API จะไม่เปิดเผยวิธีบังคับเกลือเฉพาะ)
Ulrich Schwarz

คำตอบ:


156

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

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

นี่คือคุณสมบัติของระบบ PAMที่ใช้ในพื้นหลังของpasswdเครื่องมือ PAM ถูกใช้โดยลีนุกซ์รุ่นใหม่

โดยเฉพาะอย่างยิ่งpam_cracklibเป็นโมดูลสำหรับ PAM ที่อนุญาตให้ปฏิเสธรหัสผ่านตามจุดอ่อนต่าง ๆ ที่จะทำให้พวกเขามีความเสี่ยงมาก

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

ดูเพิ่มเติมที่pam_cracklibmanpage


คุณมีความคิดใน "วิธี" คำอธิบายของคุณเหมาะกับข้อโต้แย้งที่รายงานในคำตอบของฉันได้อย่างไร มีสองวิธีที่แตกต่างกันซึ่งดำเนินการโดยแอปพลิเคชัน "passwd" เมื่อโฮสต์ไม่รู้จัก PAM หรือไม่ PS: ไม่มีการวิจารณ์เลย ฉันแค่สงสัย (เช่น PAM, BTW เป็นครั้งแรกที่ฉันเดา ... ก่อนที่จะ grepping ซอร์สโค้ด)
Damiano Verzulli

27
รบกวนยิ่งขึ้นเป็นกฎรหัสผ่านขององค์กรที่แจ้งเตือนคุณหากคุณใช้รหัสผ่านที่เหมือนกันหรือคล้ายกันในสี่คนสุดท้าย
Nick T

4
@NickT สิ่งนั้นรบกวน (จำเป็น) รบกวนพวกเขาไม่สามารถเพียงแค่บันทึกแฮช 4 ครั้งสุดท้ายของคุณจากนั้นเปรียบเทียบแต่ละอันกับข้อเสนอใหม่ของคุณในแบบเดียวกับคำถามนี้
neminem

1
@neminem "... หรือคล้ายกัน"
นิค T

1
@NickT Ah ยุติธรรมพอเพราะในกรณีนี้คุณกำลังเปรียบเทียบกับ "รหัสผ่านเก่า" ที่ผู้ใช้ป้อนเพื่อเปลี่ยนรหัสผ่านแทนที่จะเป็นแฮชที่บันทึกไว้ อย่างไรก็ตามคุณสามารถใช้วิธีการที่ BWG โพสต์ไว้ในความคิดเห็นอย่างน้อยในการตรวจสอบการเปลี่ยนแปลงที่ง่ายมาก (การทดแทนอักขระหนึ่งตัวการเพิ่ม / ลบหนึ่งตัวอักษร ฯลฯ )
neminem

46

อย่างน้อยใน Ubuntu ของฉันข้อความ "คล้ายกันมาก" ก็หมดลง เมื่อ: "... มากกว่าครึ่งหนึ่งของตัวละครต่างกัน .... " (ดูรายละเอียดด้านล่าง) ขอบคุณที่รองรับ PAM ดังที่อธิบายไว้ในคำตอบ @slhck อย่างชัดเจน

สำหรับแพลตฟอร์มอื่น ๆ ที่ไม่ได้ใช้ PAM ข้อความ "คล้ายกันมากเกินไป" จะเกิดขึ้นเมื่อ: "... มากกว่าครึ่งหนึ่งของตัวละครต่างกัน ... " (ดูรายละเอียดด้านล่าง)

หากต้องการตรวจสอบคำแถลงนี้เพิ่มเติมด้วยตนเองคุณสามารถตรวจสอบซอร์สโค้ดได้ นี่คือวิธี

โปรแกรม "passwd" รวมอยู่ในแพ็คเกจ passwd:

verzulli@iMac:~$ which passwd
/usr/bin/passwd
verzulli@iMac:~$ dpkg -S /usr/bin/passwd
passwd: /usr/bin/passwd

ขณะที่เราจัดการกับเทคโนโลยีโอเพ่นซอร์สเรามีการเข้าถึงซอร์สโค้ดแบบไม่ จำกัด รับมันง่ายเหมือน:

verzulli@iMac:/usr/local/src/passwd$ apt-get source passwd

หลังจากนั้นง่ายต่อการค้นหาส่วนที่เกี่ยวข้องของรหัส:

verzulli@iMac:/usr/local/src/passwd$ grep -i -r 'too similar' .
[...]
./shadow-4.1.5.1/NEWS:- new password is not "too similar" if it is long enough
./shadow-4.1.5.1/libmisc/obscure.c:     msg = _("too similar");

ตรวจสอบอย่างรวดเร็วเพื่อ "obscure.c" ให้สิ่งนี้ (ฉันตัดและวางเฉพาะส่วนที่เกี่ยวข้องของรหัส):

static const char *password_check (
    const char *old,
    const char *new,
    const struct passwd *pwdp)
{
    const char *msg = NULL;
    char *oldmono, *newmono, *wrapped;

    if (strcmp (new, old) == 0) {
            return _("no change");
    }
    [...]
    if (palindrome (oldmono, newmono)) {
            msg = _("a palindrome");
    } else if (strcmp (oldmono, newmono) == 0) {
            msg = _("case changes only");
    } else if (similar (oldmono, newmono)) {
            msg = _("too similar");
    } else if (simple (old, new)) {
            msg = _("too simple");
    } else if (strstr (wrapped, newmono) != NULL) {
            msg = _("rotated");
    } else {
    }
    [...]
    return msg;
}

ดังนั้นตอนนี้เรารู้ว่ามีฟังก์ชั่น "ที่คล้ายกัน" ซึ่งขึ้นอยู่กับการตรวจสอบเก่าและการตรวจสอบใหม่หากทั้งสองมีความคล้ายคลึงกัน นี่คือตัวอย่าง:

/*
 * more than half of the characters are different ones.
 */
static bool similar (const char *old, const char *new)
{
    int i, j;

    /*
     * XXX - sometimes this fails when changing from a simple password
     * to a really long one (MD5).  For now, I just return success if
     * the new password is long enough.  Please feel free to suggest
     * something better...  --marekm
     */
    if (strlen (new) >= 8) {
            return false;
    }

    for (i = j = 0; ('\0' != new[i]) && ('\0' != old[i]); i++) {
            if (strchr (new, old[i]) != NULL) {
                    j++;
            }
    }

    if (i >= j * 2) {
            return false;
    }

    return true;
}

ฉันยังไม่ได้ตรวจสอบรหัส C ฉัน จำกัด ตัวเองในการไว้วางใจความคิดเห็นก่อนหน้านิยามฟังก์ชัน :-)


ความแตกต่างระหว่างแพลตฟอร์มการรับรู้ของ PAM และ NON-PAM นั้นกำหนดไว้ในไฟล์ "obscure.c" ที่มีโครงสร้างเช่น:

#include <config.h>
#ifndef USE_PAM
[...lots of things, including all the above...]
#else                           /* !USE_PAM */
extern int errno;               /* warning: ANSI C forbids an empty source file */
#endif                          /* !USE_PAM */

9
นี่เป็นคำตอบที่ยาวที่ดูเหมือนจะไม่ตอบคำถามโดยตรงว่าสามารถเปรียบเทียบกับรหัสผ่านเก่าได้อย่างไรเมื่อรหัสผ่านถูกแฮช
jamesdlin

10
@jamesdlin: ตามที่ระบุไว้ในความคิดเห็น Rinzwind กับคำถามเดิมแฮชไม่ได้มีบทบาทใด ๆ ในเรื่องนี้: เมื่อคุณออกคำสั่ง "passwd" เพื่อเปลี่ยนรหัสผ่านคุณต้องระบุรหัสผ่าน "เก่า" และ "ใหม่" ดังนั้นรหัส "passwd" จึงไม่มีปัญหาเลยในการเปรียบเทียบ / ตรวจสอบทั้งรหัสผ่านในครั้งเดียว (ในรูปแบบที่ชัดเจน; ไม่แฮชเลย)
Damiano Verzulli

3
@DamianoVerzulli อย่างไรก็ตามนี่ไม่ได้ตอบคำถาม คำถามไม่ใช่ "คุณใช้รหัส C เพื่อบอกว่ามีสองสายเหมือนกันหรือไม่" รหัสผ่านนั้นเหมือนกันทุกประการ สิ่งที่เกี่ยวกับรหัสผ่านที่ทำให้พวกเขาน่าสนใจคือพวกเขาไม่เคยถูกเก็บไว้ในรูปแบบธรรมดาและนั่นคือคำถามที่ถาม คำตอบนี้ "ใช้เกณฑ์อะไรและทำอย่างไรใน C" แต่มันใช้เวลานานเกินไปสำหรับ "เกณฑ์อะไร" และ "วิธีที่ฉันจะใช้ใน C" เป็นคำถาม SO ไม่ใช่คำถาม SU
cpast

7
@DamianoVerzulli และความจริงที่ว่าpasswdขอรหัสผ่านทั้งเก่าและใหม่คือคำตอบ ส่วนที่เหลือของคำตอบนี้ไม่เกี่ยวข้อง
jamesdlin

3
+1 สำหรับคำตอบที่เกี่ยวข้องและน่าสนใจที่สุด! มันเป็นการดีที่จะเห็นว่ารหัสจริงการเปรียบเทียบรหัสผ่านใช้งานได้จริงบนข้อความธรรมดาและอย่างที่คาดไว้ไม่ใช่แฮช
โก้

37

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

$ passwd
Current Password:
New Password:
Repeat New Password:

Password changed successfully

มันรู้รหัสผ่านใหม่ของคุณคล้ายกัน ... เพราะคุณพิมพ์รหัสเก่าในเวลาก่อน


2
"... หรือขนมหวาน"
Nick T

1
กระต่ายโง่ trix สำหรับเด็ก ๆ !
iAdjunct

1
สิ่งที่ไม่ได้อธิบายคือเมื่อรู้รหัสผ่านในอดีตของคุณ :) "ใช้รหัสผ่านเร็วเกินไป" ซึ่งป้องกันการสลับรหัสผ่านเดียวกันสองสามครั้งในสภาพแวดล้อมขององค์กร
Juha Untinen

3
@Juha Untinen: นั่นเป็นเรื่องจริง แต่สามารถจัดการได้โดยการจดจำแฮช N อันสุดท้าย การจับ "เหมือนกับรหัสผ่านที่ Nth" นั้นเป็นเรื่องง่ายมัน " คล้ายกับรหัสผ่านที่ Nth" ซึ่งยาก เท่าที่ฉันทราบระบบเหล่านี้จะตรวจสอบความคล้ายคลึงกันกับรหัสผ่านล่าสุดและ sameness กับ N. สุดท้ายหากพวกเขาตรวจสอบความคล้ายคลึงกันกับ N สุดท้าย ... นั่นเป็นเคล็ดลับที่น่าสนใจจริง ๆ ใช่ไหม! ฉันไม่รู้ว่าพวกเขาจะทำเช่นนั้นได้อย่างไร
Cort Ammon

8

แม้ว่าคำตอบอื่น ๆ นั้นถูกต้อง แต่ก็อาจคุ้มค่าที่จะพูดถึงว่าคุณไม่จำเป็นต้องใส่รหัสผ่านเก่าเพื่อให้มันใช้งานได้!

ในความเป็นจริงเราสามารถสร้างรหัสผ่านได้หลายแบบคล้ายกับรหัสผ่านใหม่ที่คุณให้ไว้แฮชรหัสผ่านแล้วตรวจสอบว่าแฮชเหล่านี้ตรงกับรหัสเดิมหรือไม่ หากเป็นกรณีนี้รหัสผ่านใหม่จะถูกตัดสินเช่นเดียวกับรหัสผ่านเก่า! :)


2
แม้ว่านี่จะเป็นวิธีการที่จะทำให้เพลงนี้สำเร็จ (และมีการใช้งานโดยเว็บไซต์จำนวนมาก) แต่นั่นไม่ใช่สิ่งที่เกิดขึ้นในกรณีนี้
Brian S

นั่นเป็นเคล็ดลับที่เรียบร้อย! เข้มข้นกว่าการคำนวณเล็กน้อย แต่ฉลาด!
Cort Ammon

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

@hyde ที่ขึ้นอยู่กับเกณฑ์ที่บางคนอาจคิด สำหรับฉันรหัสผ่านจะคล้ายกันหากมีการเพิ่ม / ลบ / แก้ไขสูงสุด 3 ตัวอักษร นั่นคือ 62 แฮชสำหรับตัวละครทุกตัว (และถ้าเราใช้ตัวอักษรและตัวเลขเท่านั้น) คูณด้วย 3 จากความยาวของรหัสผ่าน ( n) ซึ่งก็คือ62 * (n!)/(6 * (n - 3)!)ซึ่งเท่ากับ 13540 สำหรับรหัสผ่านแบบยาว 12 ตัวอักษร แต่ถ้าใครคิดเกี่ยวกับบางสิ่งบางอย่างที่แตกต่างกันสมการไม่มีประโยชน์ดังนั้นทำไมต้องรำคาญ
Killah

คำตอบที่โง่ แต่ยังเข้าใจ ทำไมโง่ 1. คุณต้องสร้างจำนวนแฮชที่ไม่สามารถจินตนาการได้ 2. การตั้งค่าดังกล่าวจะทำให้ความปลอดภัยของรหัสผ่านดั้งเดิมลดลง หากมีใครได้รับรหัสผ่านที่คล้ายกันทั้งหมดแทนที่จะใช้แฮชเพียงครั้งเดียวพวกเขาจะมีเวลามากขึ้นในการถอดรหัส
Rok Kralj

5

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

นี่คือวิธีการremember=Nทำงานใน PAM (เก็บไว้ใน/etc/security/opasswd) แต่ผู้ค้า Windows และ Unix รายอื่น ๆ ก็มีฟังก์ชั่นที่คล้ายกัน

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