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


145

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

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


30
1 बंद: सादा पाठ? नहीं। अगर (!) ने आपको हैश बचाया और हैश की तुलना की। लिनक्स में हालांकि यह नए पासवर्ड के साथ वर्तमान पासवर्ड की जांच करता है। पासवर्ड बदलते समय उपयोगकर्ता द्वारा BOTH की आपूर्ति की जाती है।
रिनजविंड

42
@Rinzwind लेकिन की तुलना हैश काम नहीं करेगा क्योंकि एक एक चरित्र का अंतर एक पूरी तरह से अलग हैश में परिणाम चाहिए
slhck

17
यह भी देखें कि क्या फ़ेसबुक प्ले-टेक्स्ट पासवर्ड को स्टोर करता है? अन्य सुरक्षा के लिए सूचना सुरक्षा पर समान समानता का पता लगाने के लिए केवल पुराने पासवर्ड का हैश और नए पासवर्ड (पुराने के लिए कोई प्लेटेक्स्ट) नहीं है।
बॉब

21
आप वास्तव में हैशेड पुराने पासवर्ड और एक सादे नए पासवर्ड के बीच समानता के लिए परीक्षण कर सकते हैं। बस नए के समान पासवर्ड की एक सूची तैयार करें, उन सभी को हैश करें, और परिणामी हैश की तुलना पुराने पासवर्ड हैश से करें। यदि कोई मैच, तो यह समान है।
BWG

2
@BWG: यह एक मामूली ओवरसिलेशन है - वर्तमान हैशिंग योजनाएँ हैश को नमक करती हैं, इसलिए पहले आप पुराने पासवर्ड हैश से नमक निकालने के लिए हवलदार करें और सुनिश्चित करें कि आप अपने समान-से-नए पासवर्ड के लिए उस नमक का उपयोग करें। (मैं इसे इंगित कर रहा हूं क्योंकि यह संभव है कि एपीआई एक विशिष्ट नमक को बाध्य करने का एक तरीका नहीं निकालेगा।)
उलरिच श्वार्ज़

जवाबों:


156

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

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

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

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

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

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


क्या आपके पास मेरे उत्तर में दी गई दलीलों के साथ "स्पष्टीकरण" में आपके विचार हैं? वहाँ दो अलग दृष्टिकोण, "पासवर्ड" आवेदन के द्वारा लिया जाता है, जब मेजबान है नहीं पीएएम अवगत? पुनश्च: कोई आलोचक नहीं। मैं सोच रहा हूं (PAM, BTW के रूप में, मेरा पहला अनुमान था ... स्रोत कोड को ठीक करने से पहले)।
दामियानो वेरज़ुल्ली

27
अधिक परेशान करने वाले कॉर्पोरेट पासवर्ड नियम हैं जो आपको सचेत करते हैं यदि आपने पिछले चार में से किसी एक में समान या समान पासवर्ड का उपयोग किया है।
निक टी

4
@NickT यह कैसे (आवश्यक रूप से) परेशान कर रहा है - क्या वे आपके अंतिम 4 हैश को बचा नहीं सकते थे, फिर उनमें से प्रत्येक की तुलना इस प्रस्तावित प्रश्न के समान करने के लिए करें?
नीमनेम

1
@neminem "... या समान"
निक टी

1
@NickT आह, काफी उचित है, क्योंकि इस विशेष मामले में आप "पुराने पासवर्ड" के खिलाफ तुलना कर रहे हैं जो उपयोगकर्ता द्वारा इनपुट को बदलने के लिए है, बजाय सहेजे गए हैश के खिलाफ। फिर भी, आप कम से कम वास्तव में सरल परिवर्तनों (एक वर्ण प्रतिस्थापन, एक वर्ण जोड़ा / हटाया गया, आदि) की जाँच के लिए, कम से कम BWG विधि का उपयोग कर सकते हैं
नीनीम

46

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

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

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

"पासवार्ड" प्रोग्राम को पासवार्ड पैकेज में शामिल किया गया है:

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


पीएएम और एनओएन-पीएएम जागरूक प्लेटफार्मों के बीच का अंतर "अस्पष्ट सी" फाइल में परिभाषित किया गया है जो कि संरचित है:

#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
यह एक लंबा जवाब है जो सीधे इस सवाल का जवाब नहीं देता है कि यह पासवर्ड के रूप में हैशेड के रूप में पुराने पासवर्ड के खिलाफ तुलना कैसे कर सकता है।

10
@jamesdlin: जैसा कि मूल सवाल रिनविंड टिप्पणी में कहा गया है, हैश इस मामले में कोई भूमिका नहीं निभाते हैं: जब आप पासवर्ड बदलने के लिए "पासवार्ड" आदेश जारी करते हैं, तो आपको "पुराना" और "नया" दोनों पासवर्ड प्रदान करने की आवश्यकता होती है। तो "पासवार्ड" कोड को दोनों पासवर्ड की एक साथ तुलना करने / जाँच करने में बिल्कुल भी कोई समस्या नहीं है (स्पष्ट रूप में, बिल्कुल नहीं हैशेड)।
डेमियानो Verzulli

3
@DamianoVerzulli फिर भी, यह वास्तव में सवाल का समाधान नहीं करता है। सवाल यह नहीं था कि "यदि दो तार समान हैं तो यह बताने के लिए आप किस सी कोड का उपयोग करते हैं?" यह पासवर्ड के लिए बिल्कुल वैसा ही है जैसे किसी और चीज के लिए। पासवर्ड के बारे में बात जो उन्हें दिलचस्प बनाती है वह यह है कि वे कभी भी प्लेनटेक्स्ट में संग्रहीत नहीं होते हैं, और यही वह सवाल है जिसके बारे में पूछता है। यह उत्तर देता है कि "C का उपयोग किस मापदंड से किया जाता है और यह कैसे किया जाता है", लेकिन यह "मापदंड" और "C में मैं यह कैसे करूंगा" के लिए बहुत लंबा रास्ता है, यह एक SO प्रश्न है, एसयू प्रश्न नहीं।
cpast

7
@DamianoVerzulli और passwdपुराने और नए पासवर्ड दोनों के लिए पूछने वाले तथ्य का जवाब है । इस उत्तर का बाकी हिस्सा असंबद्ध है।
jamesdlin

3
+1 के लिए और अत्यंत प्रासंगिक और दिलचस्प जवाब! यह देखना अच्छा है कि पासवर्ड की तुलना करने वाला वास्तविक कोड वास्तव में प्लेटेक्स्ट पर काम करता है और, जैसा कि अपेक्षित था, हैश पर नहीं।
निको

36

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

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

Password changed successfully

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


2
"... या कैंडी।"
निक टी

1
सिली खरगोश, ट्रिपल बच्चों के लिए हैं!
iJjunct

1
यह क्या नहीं समझाता है जब यह आपके पिछले n पासवर्ड जानता है :) "पासवर्ड का उपयोग हाल ही में किया गया है", जो कॉर्पोरेट वातावरण में समान पासवर्ड को स्वैप करने से रोकता है।
जूहा अनटाइनन

3
@ जूहा अन्टिनन: यह सच है, लेकिन अंतिम एन हैश को याद करके ही इसे संभाला जा सकता है। "Nth पासवर्ड के समान" को पकड़ना आसान है, इसका " Nth पासवर्ड के समान " जो कठिन है। जहाँ तक मुझे पता है, ये सिस्टम केवल अंतिम पासवर्ड के साथ समानता के लिए जाँच करते हैं, और शालीनता अंतिम N को मिटा देती है। यदि वे अंतिम N के साथ समानता की जाँच करते हैं ... तो यह वास्तव में एक दिलचस्प चाल है, है ना! मुझे नहीं पता कि वे ऐसा कैसे करेंगे।
Cort Ammon

7

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

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


2
हालांकि यह वास्तव में इस उपलब्धि को हासिल करने का एक साधन है (और कई वेबसाइटों द्वारा उपयोग किया जाता है), इस उदाहरण में ऐसा नहीं है।
ब्रायन एस

यह एक साफ चाल है! एक मूत थोड़ा अधिक कम्प्यूटेशनल रूप से गहन, लेकिन चतुर!
Cort Ammon

आपको कम से कम कुछ अनुमान देना चाहिए कि सार्थक जांच, या बाहरी संसाधन से लिंक करने के लिए कितने समान पासवर्ड उत्पन्न करने की आवश्यकता होगी। अन्यथा यह केवल संभावित विकल्प का एक विचार है, एक पुष्ट उत्तर नहीं।
हाइड

@ कोई ऐसा मानदंड जिसके आधार पर कोई सोच सकता है। मेरे लिए पासवर्ड समान हैं यदि अधिकतम 3 वर्ण जोड़े / हटाए गए / संशोधित किए गए हैं। तो यह है कि प्रत्येक वर्ण के लिए 62 हैश (और अगर हम केवल अल्फ़ान्यूमेरिक्स का उपयोग करते हैं) पासवर्ड की लंबाई ( n) से 3 का संयोजन होता है 62 * (n!)/(6 * (n - 3)!), जो कि 12 वर्णों के लिए 13540 के बराबर है। लेकिन अगर किसी को कुछ अलग के बारे में लगता है कि समीकरण बेकार है, तो परेशान क्यों?
किल्लाह

बेवकूफ जवाब, लेकिन फिर भी एक अंतर्दृष्टि। क्यों मूर्ख? 1. आपको एक अकल्पनीय संख्या में हैश उत्पन्न करना होगा। 2. इस तरह के सेटअप से मूल पासवर्ड की सुरक्षा कमजोर हो जाएगी। अगर किसी को सिर्फ एक हैश के बजाय सभी समान पासवर्डों के हैश प्राप्त होते हैं, तो उन्हें इसे क्रैक करने के लिए बहुत आसान समय होगा।
रोख क्रालज

5

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.