سؤال كيف يعرف نظام Linux أن كلمة المرور الجديدة تشبه كلمة المرور السابقة؟


حاولت في بعض الأحيان تغيير كلمة مرور المستخدم على العديد من أجهزة Linux وعندما كانت كلمة المرور الجديدة تشبه كلمة المرور القديمة ، اشتكى نظام التشغيل من أنها متشابهة للغاية.

تساءلت دائمًا ، كيف يعرف النظام ذلك؟ اعتقدت أنه يتم حفظ كلمة المرور كتجزئة. هل يعني ذلك أنه عندما يكون النظام قادرًا على مقارنة كلمة المرور الجديدة للتشابه ، يتم حفظ كلمة المرور القديمة كنص عادي؟


140
2017-12-27 17:22


الأصل


أول مرة: نص عادي؟ لا. إذا قمت بحفظ (!) قمت بحفظ التجزئة ومقارنة التجزئة. في لينكس على الرغم من أنه يتحقق كلمة المرور الحالية بكلمة مرور جديدة. يتم توفير كلاهما من قبل المستخدم عند تغيير كلمات المرور. - Rinzwind
Rinzwind لكن المقارنة بين التجزئات لن تعمل لأن اختلاف حرف واحد يجب أن يؤدي إلى تجزئة مختلفة تمامًا - slhck
أنظر أيضا هل يقوم فيس بوك بتخزين كلمات المرور النصية العادية؟ على أمن المعلومات لطرق أخرى للكشف عن التشابه بالنظر فقط التجزئة من كلمة المرور القديمة ونص عادي من كلمة المرور الجديدة (لا يوجد نص عادي للقديم). - Bob
يمكنك بالفعل اختبار التشابه بين كلمة المرور القديمة المجزأة وكلمة مرور جديدة بصيغة نص عادي. ما عليك سوى إنشاء قائمة بكلمات المرور تشبه قائمة كلمات المرور الجديدة ، وتمييزها كلها ، ومقارنة عمليات التجزئة الناتجة بتجزئة كلمة المرور القديمة. إذا كان أي تطابق ، فهو مشابه. - BWG
BWG: هذا تبسيط طفيف - مخططات التجزئة الحالية ملح التجزئة ، لذلك عليك أولا استخراج الملح من تجزئة كلمة المرور القديمة وتأكد من استخدام هذا الملح كلمات المرور الخاصة بك مشابهة إلى جديدة. (أشير إلى ذلك لأنه من المحتمل ألا تعرض واجهة برمجة التطبيقات طريقة لفرض ملح معين.) - Ulrich Schwarz


الأجوبة:


منذ كنت في حاجة لتوريد كل من القديم و كلمة المرور الجديدة عند استخدام passwd، يمكن بسهولة مقارنة في نص عادي ، في الذاكرة ، دون كتابتها في مكان ما على محرك الأقراص.

في الواقع يتم تجزئة كلمة المرور الخاصة بك عندما يتم تخزينها أخيرًا ، ولكن حتى يحدث ذلك ، فإن الأداة التي تدخل فيها كلمة المرور الخاصة بك يمكن بالطبع الوصول إليها مباشرة مثل أي برنامج آخر يمكنه الوصول إلى الأشياء التي أدخلتها على لوحة المفاتيح أثناء قراءتها من STDIN.

هذه هي سمة من سمات نظام PAM الذي يستخدم في خلفية passwd أداة. يستخدم PAM بواسطة توزيعات لينكس الحديثة.

اكثر تحديدا، pam_cracklib هي وحدة لـ PAM تسمح برفض كلمات المرور استنادًا إلى نقاط ضعف متعددة تجعلها ضعيفة للغاية.

إنها ليست مجرد كلمات مرور متشابهة للغاية ويمكن اعتبارها غير آمنة. ال مصدر الرمز  لديه العديد من الأمثلة لما يمكن التحقق منه ، على سبيل المثال ، ما إذا كانت كلمة المرور متوازية أو ما هي مسافة التحرير بين كلمتين. والفكرة هي جعل كلمات المرور أكثر مقاومة ضد هجمات القاموس.

أنظر أيضا ال pam_cracklib manpage.


155
2017-12-27 19:27



هل لديك أفكار في "كيف" يتوافق تفسيرك مع الحجج الواردة في جوابي؟ هل هناك طريقتان مختلفتان ، تم أخذهما بواسطة تطبيق "passwd" ، عندما يكون المضيف ليس PAM علم؟ ملاحظة: لا يوجد نقاد على الإطلاق. أنا فقط أتساءل (كما كان بام ، راجع للشغل ، كان أول تخمين ... فقط قبل الزحف رمز المصدر). - Damiano Verzulli
أكثر إثارة للقلق هي قواعد كلمة مرور الشركة التي تنبهك إذا كنت قد استخدمت كلمة المرور نفسها أو كلمة المرور المماثلة بين أي من الأربعة الآخرين. - Nick T
NickT كيف يمكن لذلك (بالضرورة) أن يزعجك - ألا يستطيع فقط حفظ آخر 4 تجزئات ، ثم قارن كل واحد منها بتلك الخاصة بك الجديدة المقترحة بنفس طريقة هذا السؤال؟ - neminem
neminem "... أو ما شابه" - Nick T
NickT آه ، عادلة بما فيه الكفاية ، لأنه في هذه الحالة بالذات كنت تقارن ضد "كلمة المرور القديمة" هذا الإدخال من قبل المستخدم لتغيير كلمة المرور ، وليس ضد التجزئة المحفوظة. لازلت انت استطاع استخدم طريقة BWG في تعليق ، على الأقل لفحص تغييرات بسيطة على الأقل (استبدال حرف واحد ، إضافة حرف واحد أو إزالته ، وما إلى ذلك). - neminem


على الأقل في 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 */

46
2017-12-28 18:14



هذه إجابة طويلة لا يبدو أنها تجيب بشكل مباشر على السؤال عن كيفية مقارنتها بكلمة المرور القديمة عندما يتم تجزئة كلمات المرور. - jamesdlin
jamesdlin: كما ورد في تعليق Rinzwind على السؤال الأصلي ، تفعل التجزئة ليس تلعب أي دور في هذه المسألة: عند إصدار الأمر "passwd" لتغيير كلمة المرور ، يجب عليك تقديم كلمة المرور "القديمة" و "الجديدة". لذلك ، لا توجد أي مشكلة على الإطلاق في شفرة "passwd" في مقارنة / التحقق من كلمة المرور في آنٍ واحد (في نماذج واضحة ؛ لا يتم تجزئتها على الإطلاق). - Damiano Verzulli
DamianoVerzulli ومع ذلك ، هذا لا يعالج السؤال. لم يكن السؤال "ما هو كود C الذي تستخدمه لمعرفة ما إذا كانت السلاسل متشابهة ؛" هذا هو بالضبط نفس الشيء بالنسبة لكلمات المرور مثل أي شيء آخر. الشيء عن كلمات السر الذي يجعلهم مثيرون للاهتمام هو أنهم لم يخزنوا أبدا في نص عادي ، وهذا ما يسأل عنه السؤال. هذا يجيب "ما هي المعايير المستخدمة وكيف يتم ذلك في C" ، ولكن الوقت طويل للغاية بالنسبة لـ "ما هي المعايير" و "كيف أفعل هذا في C" هو سؤال SO ، وليس سؤال SU. - cpast
DamianoVerzulli وحقيقة ذلك passwd يسأل عن كلمات المرور القديمة والجديدة هو الجواب الصحيح. ما تبقى من هذه الإجابة هو غير مناسب. - jamesdlin
+1 للإجابة ذات الصلة للغاية ومثيرة للاهتمام! من الجيد أن نرى أن الشفرة الفعلية التي تقارن كلمة المرور تعمل في الواقع على النص العادي ، كما هو متوقع ، وليس على التجزئة. - nico


الجواب أبسط بكثير مما تعتقد. في الواقع ، إنها تقترب من السحر ، لأنك بمجرد أن تشرح الخدعة ، تكون قد اختفت:

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

Password changed successfully

إنه يعلم أن كلمة المرور الجديدة متشابهة ... نظرًا لأنك كتبت كلمة المرور القديمة في لحظة من قبل.


37
2017-12-29 13:41



"... أو الحلوى." - Nick T
الأرنب السخيفة ، تريكس هي للأطفال! - iAdjunct
ما لا يشرحه هو عندما يعرف كلمات المرور الخاصة بك الماضية :) "كلمة المرور قد استخدمت في الآونة الأخيرة" ، مما يمنع مبادلة نفس كلمات المرور القليلة في بيئة الشركات. - Juha Untinen
@ Juha Untinen: هذا صحيح ، ولكن يمكن التعامل معه ببساطة عن طريق تذكر آخر تجزئات N. اصطياد "نفس كلمة المرور Nth" هو سهل ، في "مماثل إلى nth كلمة المرور "وهذا أمر صعب. بقدر ما أنا على علم ، هذه الأنظمة فقط التحقق من وجود تشابه مع كلمة المرور الأخيرة ، وضبطه مع آخر N. إذا كانت تحقق من التشابه مع N الماضي ... وهذا أمر مثير للاهتمام حقا خدعة الآن ، أليس كذلك! ليس لدي أي فكرة عن كيفية قيامهم بذلك. - Cort Ammon


على الرغم من أن الإجابات الأخرى صحيحة ، فقد يكون من المفيد الإشارة إلى أنك لست بحاجة إلى إدخال كلمة المرور القديمة حتى تعمل!

في الواقع ، يمكن للمرء إنشاء مجموعة من كلمات المرور المشابهة لكلمة المرور الجديدة التي أدخلتها ، ثم تجزئها ، ثم تحقق مما إذا كان أي من هذه التجزئة يتطابق مع القديم. إذا كانت هذه هي الحالة ، فسيتم الحكم على كلمة المرور الجديدة بنفس الطريقة القديمة! :)


8
2018-01-02 11:06



في حين أن هذا هو في الواقع وسيلة لتحقيق هذا العمل الفذ (ويستخدم من قبل العديد من المواقع) ، وهذا ليس ما يحدث في هذه الحالة. - Brian S
هذه خدعة أنيقة! A أكثر قليلا جدا computationally مكثفة ، ولكن ذكي! - Cort Ammon
يجب عليك على الأقل إعطاء بعض التقدير لعدد كلمات المرور المشابهة التي يجب أن يتم إنشاؤها لإجراء فحص ذي معنى ، أو رابط لمورد خارجي. وإلا فإن هذه مجرد فكرة عن بديل محتمل ، وليس إجابة مدعومة. - hyde
hyde يعتمد على المعايير التي قد يفكر فيها شخص ما. بالنسبة لي كلمات المرور متشابهة إذا كان هناك 3 أحرف كحد أقصى تمت إضافتها / إزالتها / تعديلها. هذا هو 62 تجزئة لكل حرف (وهذا إذا استخدمنا أبجديات رقمية فقط) مجموعة من 3 مرات من طول كلمة المرور (n)، الذي 62 * (n!)/(6 * (n - 3)!)، والتي تساوي 13540 لمدة 12 كلمة مرور طويلة. ولكن إذا كان أي شخص يفكر في شيء مختلف فإن المعادلة غير مجدية ، فلماذا تزعج نفسك؟ - Killah
إجابة غبية ، ولكن البصيرة مع ذلك. لماذا غبي؟ 1. عليك إنشاء عدد لا يمكن تخيله من التجزئات. 2. هذا الإعداد من شأنه أن يضعف أمن كلمة المرور الأصلية. إذا حصل شخص ما على تجزئة لكل كلمات المرور المتشابهة بدلاً من تجزئة واحدة ، فسيكون لديه وقتًا أسهل بكثير لكسره. - Rok Kralj


لم يتم تغطية جانب واحد: تاريخ كلمة المرور. بعض الأنظمة تدعم هذا. من أجل القيام بذلك ، فإنه يحتفظ بسجل من كلمات المرور وتشفيرها باستخدام كلمة المرور الحالية. عندما تقوم بتغيير كلمة المرور الخاصة بك ، فإنه يستخدم كلمة المرور "القديمة" لفك تشفير القائمة والتحقق منها. وعندما تقوم بتعيين كلمة مرور جديدة ، فإنها تقوم بحفظ القائمة (مرة أخرى) مشفرة باستخدام مفتاح مشتق من كلمة المرور الجديدة.

هذه هي الطريقة remember=N يعمل في PAM (تخزينها في /etc/security/opasswd). ولكن أيضًا ، يقدم Windows وغيره من موردي Unix وظائف مماثلة.


4