सवाल लिनक्स कैसे जानता है कि नया पासवर्ड पिछले के समान है?


कुछ बार मैंने विभिन्न लिनक्स मशीनों पर उपयोगकर्ता पासवर्ड बदलने की कोशिश की और जब नया पासवर्ड पुराने जैसा था, तो ओएस ने शिकायत की कि वे बहुत समान थे।

मैंने हमेशा सोचा, सिस्टम यह कैसे जानता है? मैंने सोचा कि पासवर्ड हैश के रूप में सहेजा गया है। क्या इसका मतलब यह है कि जब सिस्टम समानता के लिए नए पासवर्ड की तुलना करने में सक्षम होता है तो पुराना वास्तव में सादे पाठ के रूप में सहेजा जाता है?


140
2017-12-27 17:22


मूल


पहला बंद: सादा पाठ? नहीं। अगर (!) सहेजे गए हैं तो आपने हैश को बचाया है और हैश की तुलना करें। लिनक्स में हालांकि यह नए पासवर्ड के साथ वर्तमान पासवर्ड की जांच करता है। पासवर्ड बदलते समय दोनों द्वारा उपयोगकर्ता द्वारा आपूर्ति की जाती है। - Rinzwind
@Rinzwind लेकिन हैश की तुलना करना काम नहीं करेगा क्योंकि एक चरित्र अंतर का परिणाम पूरी तरह से अलग हैश में होना चाहिए - slhck
यह भी देखें क्या फेसबुक सादे-पाठ पासवर्ड स्टोर करता है? पर सूचना सुरक्षा समानता का पता लगाने के अन्य तरीकों के लिए पुराने पासवर्ड का हैश और नए पासवर्ड के सादे पाठ (पुराने के लिए कोई सादा पाठ नहीं) दिया गया है। - Bob
आप वास्तव में एक हैश पुराने पासवर्ड और सादे टेक्स्ट नए पासवर्ड के बीच समानता के लिए परीक्षण कर सकते हैं। बस नए के समान पासवर्ड की एक सूची उत्पन्न करें, उन सभी को हैश करें, और परिणामस्वरूप हैश की तुलना पुराने पासवर्ड हैश से करें। यदि कोई मैच है, तो यह समान है। - BWG
@ बीडब्ल्यूजी: यह मामूली oversimplification है - वर्तमान हैशिंग योजना हैश नमक, तो पहले आप पुराने पासवर्ड हैश से नमक निकालने के लिए havce है और सुनिश्चित करें कि आप अपने समान नए पासवर्ड के लिए उस नमक का उपयोग करें। (मैं इसे इंगित कर रहा हूं क्योंकि यह संभव है कि एपीआई एक विशिष्ट नमक को मजबूर करने के लिए एक रास्ता नहीं दिखाएगा।) - Ulrich Schwarz


जवाब:


चूंकि आपको पुराने दोनों को आपूर्ति करने की आवश्यकता है तथा उपयोग करते समय नया पासवर्ड passwd, उन्हें ड्राइव पर कहीं भी लिखने के बिना, स्मृति में, सादे पाठ में आसानी से तुलना की जा सकती है।

दरअसल आपका पासवर्ड आखिरकार संग्रहीत होने पर धोया जाता है, लेकिन जब तक ऐसा नहीं होता है, तो वह टूल जहां आप अपना पासवर्ड दर्ज कर रहे हैं, निश्चित रूप से बस इसे सीधे एक्सेस कर सकते हैं जैसे किसी अन्य प्रोग्राम को आपके कीबोर्ड पर दर्ज की गई चीज़ों तक पहुंच सकते हैं, जबकि यह एसटीडीआईएन से पढ़ रहा था।

यह एक विशेषता है पीएएम प्रणाली जिसका उपयोग पृष्ठभूमि में किया जाता है passwd उपकरण। आधुनिक लिनक्स वितरण द्वारा पीएएम का उपयोग किया जाता है।

अधिक विशेष रूप से, pam_cracklib पीएएम के लिए एक मॉड्यूल है जो कई कमजोरियों के आधार पर पासवर्ड को अस्वीकार करने की अनुमति देता है जो उन्हें बहुत कमजोर बना देगा।

यह केवल पासवर्ड नहीं है जो बहुत समान हैं जिन्हें असुरक्षित माना जा सकता है। सोर्स कोड  क्या जांच की जा सकती है के विभिन्न उदाहरण हैं, उदाहरण के लिए चाहे पासवर्ड एक पालिंड्रोम है या संपादन दूरी दो शब्दों के बीच क्या है। विचार है कि शब्दकोश हमलों के खिलाफ पासवर्ड को अधिक प्रतिरोधी बनाना है।

यह भी देखें pam_cracklib मैनपेज।


155
2017-12-27 19:27



क्या आपके विचारों में आपके जवाब में बताए गए तर्कों के साथ "स्पष्टीकरण" कैसे है? मेजबान होने पर "पासवाड" एप्लिकेशन द्वारा लिया गया दो अलग-अलग दृष्टिकोण हैं नहीं पीएएम अवगत? पीएस .: कोई आलोचकों बिल्कुल नहीं। मैं बस सोच रहा हूं (जैसा कि पीएएम, बीटीडब्लू, मेरा पहला अनुमान था ... स्रोत कोड को पकड़ने से ठीक पहले)। - Damiano Verzulli
अधिक परेशान करने वाले कॉर्पोरेट पासवर्ड नियम हैं जो आपको सतर्क करते हैं यदि आपने पिछले चार में से किसी एक के समान या समान पासवर्ड का उपयोग किया है। - Nick T
@NickT वह (जरूरी) परेशान कैसे है - क्या वे सिर्फ आपके पिछले 4 हैश को सहेज नहीं सकते थे, फिर उन सभी की तुलना अपने प्रस्तावित नए से इस प्रश्न के समान ही करें? - neminem
@neminem "... या इसी तरह" - Nick T
@ निकट आह, काफी उचित है, क्योंकि इस विशेष मामले में आप "पुराने पासवर्ड" के खिलाफ तुलना कर रहे हैं जो उपयोगकर्ता द्वारा एक सहेजे गए हैश के बजाए पासवर्ड बदलने के लिए इनपुट है। अभी भी आप सकता है कम से कम सरल परिवर्तनों (एक वर्ण प्रतिस्थापन, एक वर्ण जोड़ा / हटाया गया आदि) की जांच के लिए, टिप्पणी में पोस्ट की गई बीडब्ल्यूजी विधि का उपयोग करें। - neminem


कम से कम मेरे उबंटू में, "बहुत समान" संदेश सामने आते हैं कब: "... आधे से अधिक पात्र अलग-अलग हैं ...." (विवरण के लिए नीचे देखें)। पीएएम समर्थन के लिए धन्यवाद, जैसा कि स्पष्ट रूप से @ एसएलएचके जवाब में बताया गया है।

अन्य प्लेटफ़ॉर्म के लिए, जहां पीएएम का उपयोग नहीं किया जाता है, "बहुत समान" संदेश तब आते हैं जब: "... आधे से अधिक पात्र अलग-अलग हैं ...." (विवरण के लिए नीचे देखें)

इस कथन को अपने आप जांचने के लिए, स्रोत-कोड की जांच करना संभव है। यहां कैसे।

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;
}

मैंने सी कोड की समीक्षा नहीं की है। मैंने फ़ंक्शन परिभाषा से पहले टिप्पणी पर भरोसा करने में खुद को सीमित कर दिया :-)


पीएएम और गैर-पीएएम जागरूक प्लेटफार्मों के बीच भेदभाव को "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: जैसा कि रिनज़विंड में मूल प्रश्न पर टिप्पणी की गई है, हैश करते हैं नहीं इस मामले में कोई भूमिका निभाएं: जब आप पासवर्ड बदलने के लिए "passwd" कमांड जारी करते हैं, तो आपको "पुराना" और "नया" पासवर्ड दोनों प्रदान करना होगा। तो "passwd" कोड में दोनों पासवर्ड की तुलना / जांच करने में कोई समस्या नहीं है (स्पष्ट रूपों में; बिल्कुल नहीं धोया गया)। - Damiano Verzulli
@DamianoVerzulli फिर भी, यह वास्तव में सवाल को संबोधित नहीं करता है। सवाल यह नहीं था कि "क्या सी कोड आप यह बताने के लिए उपयोग करते हैं कि दो तार समान हैं या नहीं;" पासवर्ड के लिए यह वही है जो किसी और चीज के लिए है। के बारे में बात पासवर्ड जो उन्हें दिलचस्प बनाता है कि वे कभी सादा पाठ में संग्रहित नहीं होते हैं, और यही सवाल पूछता है। यह जवाब देता है "किस मानदंड का उपयोग किया जाता है और यह सी में कैसे किया जाता है," लेकिन यह "किस मानदंड" और "सी में यह कैसे करेगा" के लिए बहुत लंबा तरीका है, एक एसयू सवाल नहीं, एक सवाल है। - cpast
@DamianoVerzulli और तथ्य यह है कि passwd पुराने और नए पासवर्ड दोनों के लिए पूछता है जवाब है। बाकी का जवाब बेकार है। - jamesdlin
+1 और अत्यंत प्रासंगिक और दिलचस्प जवाब के लिए +1! यह देखना अच्छा लगता है कि पासवर्ड की तुलना में वास्तविक कोड वास्तव में सादे टेक्स्ट पर काम करता है और जैसा कि अपेक्षित है, हैश पर नहीं। - nico


जवाब आपके विचार से कहीं अधिक सरल है। वास्तव में, यह लगभग जादू के रूप में अर्हता प्राप्त करता है, क्योंकि एक बार जब आप चाल की व्याख्या करते हैं, तो यह चला गया है:

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

Password changed successfully

यह जानता है कि आपका नया पासवर्ड समान है ... क्योंकि आपने पहले एक पल में पुराना टाइप किया था।


37
2017-12-29 13:41



"... या कैंडी।" - Nick T
बेवकूफ खरगोश, trix बच्चों के लिए हैं! - iAdjunct
यह समझ में नहीं आता है कि जब यह आपके पिछले एन पासवर्ड को जानता है :) "पासवर्ड हाल ही में उपयोग किया गया है", जो कॉर्पोरेट वातावरण में कुछ ही पासवर्ड स्वैप करने से रोकता है। - Juha Untinen
@ जुहा Untinen: यह सच है, लेकिन यह केवल अंतिम एन हैश याद करके संभाला जा सकता है। "एनएच पासवर्ड के समान" पकड़ना आसान है, इसकी "समान एनएच पासवर्ड के लिए "यह कठिन है। जहां तक ​​मुझे पता है, ये सिस्टम केवल अंतिम पासवर्ड के साथ समानता की जांच करते हैं, और अंतिम एन के साथ समानता की जांच करते हैं। यदि वे अंतिम एन के साथ समानता की जांच करते हैं ... यह वास्तव में दिलचस्प है अब चाल करो, है ना! मुझे नहीं पता कि वे ऐसा कैसे करेंगे। - Cort Ammon


हालांकि अन्य उत्तरों सही हैं, लेकिन यह उल्लेख करने लायक हो सकता है कि आपको काम करने के लिए पुराने पासवर्ड की आपूर्ति करने की आवश्यकता नहीं है!

असल में, कोई आपके द्वारा प्रदान किए गए नए पासवर्ड के समान पासवर्ड का एक समूह उत्पन्न कर सकता है, हैश, और फिर जांचें कि इनमें से कोई भी हैश पुराने से मेल खाता है या नहीं। यदि यह मामला है, तो नया पासवर्ड पुराने के समान ही तय किया जाता है! :)


8
2018-01-02 11:06



हालांकि यह वास्तव में इस उपलब्धि को हासिल करने का साधन है (और कई वेबसाइटों द्वारा इसका उपयोग किया जाता है), यह इस घटना में क्या नहीं चल रहा है। - Brian S
यह एक साफ चाल है! एक और अधिक computationally गहन, लेकिन चालाक! - Cort Ammon
आपको कम से कम कुछ अनुमान देना चाहिए कि सार्थक चेक, या बाहरी संसाधन से लिंक करने के लिए कितने समान पासवर्ड उत्पन्न किए जाने की आवश्यकता होगी। अन्यथा यह संभव विकल्प का एक विचार है, न कि एक प्रमाणित उत्तर। - hyde
@hyde जो मानदंडों पर निर्भर करता है किसी के बारे में सोच सकता है। मेरे लिए पासवर्ड समान हैं यदि अधिकतम 3 वर्ण जोड़े / हटाए गए / संशोधित किए गए थे। तो यह प्रत्येक चरित्र के लिए 62 हैश (और अगर हम केवल अल्फान्यूमेरिक्स का उपयोग करते हैं) पासवर्ड की लंबाई से 3 के समय संयोजन (n), जो है 62 * (n!)/(6 * (n - 3)!), जो 1240 लंबे पासवर्ड के लिए 13540 के बराबर है। लेकिन अगर कोई कुछ अलग सोचता है तो समीकरण बेकार है, तो परेशान क्यों? - Killah
बेवकूफ जवाब, लेकिन फिर भी एक अंतर्दृष्टि। बेवकूफ क्यों? 1. आपको एक अकल्पनीय संख्या में हैश उत्पन्न करना होगा। 2. इस तरह के सेटअप मूल पासवर्ड की सुरक्षा कमजोर होगा। अगर किसी ने सिर्फ एक हैश की बजाय सभी समान पासवर्ड के हैंश प्राप्त किए हैं, तो उन्हें क्रैक करने के लिए बहुत आसान समय होगा। - Rok Kralj


एक पहलू शामिल नहीं था: पासवर्ड इतिहास। कुछ सिस्टम इसका समर्थन करते हैं। ऐसा करने के लिए, यह पासवर्ड का इतिहास रखता है और उन्हें वर्तमान पासवर्ड से एन्क्रिप्ट करता है। जब आप अपना पासवर्ड बदलते हैं तो यह सूची को डिक्रिप्ट करने और सत्यापित करने के लिए "पुराना" पासवर्ड का उपयोग करता है। और जब यह एक नया पासवर्ड सेट करता है, तो यह नए पासवर्ड से प्राप्त कुंजी के साथ एन्क्रिप्टेड सूची (दोबारा) सहेजता है।

इस तरह से remember=N पीएएम में काम करता है (में संग्रहीत /etc/security/opasswd)। लेकिन विंडोज और अन्य यूनिक्स विक्रेता भी इसी तरह के कार्यों की पेशकश करते हैं।


4