लवण शब्दकोश हमलों को 'असंभव' क्यों बनाते हैं?


85

अपडेट: कृपया ध्यान दें कि मैं यह नहीं पूछ रहा हूं कि नमक क्या है, इंद्रधनुष तालिका क्या है, शब्दकोश हमला क्या है, या नमक का उद्देश्य क्या है। मैं प्रश्न कर रहा हूं: यदि आप उपयोगकर्ताओं को नमक और हैश के बारे में जानते हैं, तो क्या उनके पासवर्ड की गणना करना काफी आसान नहीं है?

मैं इस प्रक्रिया को समझता हूं, और इसे अपनी कुछ परियोजनाओं में स्वयं लागू करता हूं।

s =  random salt
storedPassword = sha1(password + s)

आपके द्वारा संग्रहीत डेटाबेस में:

username | hashed_password | salt

नमस्कार के हर कार्यान्वयन को मैंने देखा है कि पासवर्ड के अंत में या तो शुरुआत में नमक जोड़ता है:

hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)

इसके बाद, एक हैकर का शब्दकोष जो उसके नमक (हा हा) के लायक है, ऊपर सूचीबद्ध आम संयोजनों में संग्रहित लवणों के विरुद्ध प्रत्येक कीवर्ड को चलाएगा।

निश्चित रूप से ऊपर वर्णित कार्यान्वयन वास्तव में अंतर्निहित मुद्दे को हल किए बिना, हैकर के लिए एक और कदम जोड़ता है? इस समस्या के समाधान के लिए क्या विकल्प हैं, या क्या मैं समस्या को गलत समझ रहा हूं?

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

मैं एक उदाहरण देता हूं कि मैं कैसे प्रस्तावित करता हूं कि एक हैकर पासवर्ड और हैश की सूची के साथ एक उपयोगकर्ता डेटाबेस को हैक करेगा:

हमारे हैक किए गए डेटाबेस से डेटा:

RawPassword (not stored)  |  Hashed   |     Salt
--------------------------------------------------------
letmein                       WEFLS...       WEFOJFOFO...

आम पासवर्ड शब्दकोश:

   Common Password
   --------------
   letmein
   12345
   ...

प्रत्येक उपयोगकर्ता रिकॉर्ड के लिए, सामान्य पासवर्ड को लूप करें और उन्हें हैश करें:

for each user in hacked_DB

    salt = users_salt
    hashed_pw = users_hashed_password

    for each common_password

        testhash = sha1(common_password + salt)
        if testhash = hashed_pw then
           //Match!  Users password = common_password
           //Lets visit the webpage and login now.
        end if

    next

next

मुझे उम्मीद है कि यह मेरी बात को बहुत बेहतर दिखाता है।

10,000 सामान्य पासवर्ड और 10,000 उपयोगकर्ता रिकॉर्ड को देखते हुए, हमें यथासंभव अधिक से अधिक उपयोगकर्ता पासवर्ड खोजने के लिए 100,000,000 हैश की गणना करने की आवश्यकता होगी। इसमें कुछ घंटे लग सकते हैं, लेकिन यह वास्तव में एक मुद्दा नहीं है।

क्रैकिंग थ्योरी पर अपडेट

हम मान लेंगे कि हम एक भ्रष्ट वेबहोस्ट हैं, जिसमें SHA1 हैश और लवण के डेटाबेस तक पहुंच है, साथ ही उन्हें मिश्रण करने के लिए आपके एल्गोरिथ्म के साथ। डेटाबेस में 10,000 उपयोगकर्ता रिकॉर्ड हैं।

यह साइट GPU का उपयोग करके प्रति सेकंड 2,300,000,000 SHA1 हैश की गणना करने में सक्षम होने का दावा करती है। (वास्तविक दुनिया में स्थिति शायद धीमी होगी, लेकिन अब हम उस उद्धृत आंकड़े का उपयोग करेंगे)।

(((95 ^ 4) / 2300000000) / 2) * 10000 = 177 सेकंड

95 प्रिंट करने योग्य ASCII वर्णों की एक पूरी श्रृंखला को देखते हुए, 4 वर्णों की अधिकतम लंबाई के साथ, गणना की दर (चर) से विभाजित, 2 से विभाजित (पासवर्ड की खोज करने के लिए औसत समय मानने पर 10,000 के लिए औसतन 50% क्रमपरिवर्तन की आवश्यकता होगी)। उन उपयोगकर्ताओं को सभी उपयोगकर्ताओं के पासवर्ड काम करने में 177 सेकंड का समय लगेगा जहां लंबाई <= 4 है।

आइए इसे यथार्थवाद के लिए थोड़ा समायोजित करें।

((36 ^ 7) / 1000000000) / 2) * 10000 = 2 दिन

पासवर्ड की लंबाई <= 7 के साथ गैर-मामले की संवेदनशीलता को मानते हुए, केवल अल्फ़ान्यूमेरिक वर्ण, 10,000 उपयोगकर्ता रिकॉर्ड को हल करने में 4 दिन लगेंगे, और मैंने ओवरहेड और गैर आदर्श परिस्थिति को प्रतिबिंबित करने के लिए एल्गोरिथ्म की गति को आधा कर दिया है।

यह पहचानना महत्वपूर्ण है कि यह एक लीनियर ब्रूट फोर्स अटैक है, सभी गणना एक दूसरे से स्वतंत्र हैं, इसके अलावा कई सिस्टमों को हल करने के लिए यह एक आदर्श कार्य है। (IE अलग-अलग छोरों से हमले चलाने वाले 2 कंप्यूटरों को स्थापित करना आसान है जो कि एक्सपेक्टेशन टाइम को आधा कर देगा)।

इस कार्य को अधिक कम्प्यूटेशनल रूप से महंगा बनाने के लिए एक पासवर्ड को 1,000 गुना करने के लिए हैशिंग के मामले को देखते हुए:

((36 ^ 7) / 1 000 000 000) / 2) * 1000 सेकंड = 10.8839117 घंटे

यह 7 अल्फा-न्यूमेरिक वर्णों की अधिकतम लंबाई का प्रतिनिधित्व करता है, एक उपयोगकर्ता के लिए उद्धृत आंकड़े से आधे से भी कम गति निष्पादन ।

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


12
सलाटिंग में पूरा बिंदु आपको हैशेड पासवर्ड को देखने से रोकने और यह देखने के लिए है कि कई उपयोगकर्ताओं के पास एक ही हैश (और इस प्रकार एक ही पासवर्ड) है। बिना नमस्कार किए आप बस हैशिंग एल्गोरिथ्म का उपयोग कर सकते हैं और हर संभव हैश उत्पन्न कर सकते हैं और फिर उस हैश के लिए एक क्रूर खोज कर सकते हैं। चूंकि एल्गोरिथ्म कभी नहीं बदलता है इसलिए यह हमलावरों के लिए पूर्वानुमान योग्य बनाता है, नमकीन बनाना बस इसे और अधिक कठिन बनाता है।
BeRecursive 13

25
क्योंकि पटाखे स्लग की तरह होते हैं, और नमक उनकी त्वचा पर श्लेष्म को सूख जाता है और उन्हें मारता है।
TED

6
@ टेड: मुझे नमकीन पटाखे पसंद हैं। नमकीन स्लग, इतना नहीं।
FrustratedWithFormsDesigner

3
@Tom - अपने उदाहरण हमले में। यदि नमक नहीं है, तो हमलावर "प्रत्येक सामान्य पासवर्ड के लिए, पासवर्ड को हैश कर सकता है। क्या यह एक या अधिक उपयोगकर्ताओं से मेल खाता है? हां, मेरे पास उनका पासवर्ड है" - हमलावर सभी पासवर्डों पर "समानांतर में" हमला करने में सक्षम है। , बिना किसी अतिरिक्त लागत के।
डेमियन_इन_उन्नीवर

3
@ टॉम गुलेन - आपके पास केवल आधी तस्वीर है। नमक के बिना, एक हमलावर आपके द्वारा "अपडेट 2" में प्रदर्शित विधि का उपयोग नहीं करेगा। वह बस एक तालिका में एक खोज करेंगे और ओ (1) या ओ (लॉग एन) समय में पासवर्ड प्राप्त करेंगे (एन उम्मीदवार उम्मीदवारों की संख्या होने के नाते)। नमक वह है जो उसे रोकता है और उसे ओ (एन) दृष्टिकोण का उपयोग करने के लिए मजबूर करता है। एक अन्य तकनीक (की-स्ट्रेंथिंग) आपके लूप में प्रत्येक प्रयास को पूरी तरह से लेने का कारण बन सकती है, जिसका अर्थ है कि उन परीक्षणों को करने में 3 साल लगेंगे ... और केवल 10k पासवर्ड के साथ, आपको शून्य पासवर्ड क्रैक करने की संभावना है समय।
एरिक्सन

जवाबों:


31

हाँ, आपको sha1 (नमक | पासवर्ड) के लिए सिर्फ 3 दिन चाहिए। यही कारण है कि अच्छा पासवर्ड स्टोरेज एल्गोरिदम 1000-iteration hashing का उपयोग करता है: आपको 8 साल की आवश्यकता होगी।


3
+1, सबसे संक्षिप्त और अब तक के बिंदु उत्तर तक, मुझे नहीं पता था कि यह एक विकल्प था।
टॉम गुलेन

जाहिरा तौर पर आपने अपने सिस्टम पर कभी भी हैश बेंचमार्क नहीं किया है। आप प्रति सेकंड sha1 गणना की कई मिलें कर सकते हैं । एक हमलावर के लिए 1,000 राउंड अर्थहीन है। -1 भी क्योंकि sha1 एक टूटी हुई हैश फ़ंक्शन है।
किश्ती

जाहिर है मैं सवाल से नाम और संख्या का उपयोग कर रहा हूं। अगर आपने कभी इस विषय और स्पष्टता के बारे में सुना है ... ओह, इट्स रक। कोई बात नहीं।
जलते

1
@ देखें, 1,000 राउंड का मतलब है कि बल को 1,000 गुना अधिक समय लगेगा। मुझे एक अच्छी सुविधा की तरह लगता है।
टॉम गुलेन

अगर कोई हमलावर पासवर्ड का अनुमान लगा सकता है, तो क्या यह लॉगिन के लिए समान है (या मेरे पास कुछ बच गया है? lol)
khaled_webdev

62

यह शब्दकोश के हमलों को नहीं रोकता है।

यह क्या करता है जो किसी को रोकता है जो आपके पासवर्ड फ़ाइल की एक प्रति प्राप्त करने के लिए एक इंद्रधनुष तालिका का उपयोग करने से पता लगाता है कि पासवर्ड हैश से क्या हैं।

आखिरकार, यह क्रूर-मजबूर हो सकता है, हालांकि। उस भाग का उत्तर आपके उपयोगकर्ताओं को पासवर्ड के रूप में शब्दों का उपयोग न करने के लिए मजबूर करना है (उदाहरण के लिए कम से कम एक नंबर या विशेष वर्ण की न्यूनतम आवश्यकताएं)।

अपडेट :

मुझे यह पहले उल्लेख करना चाहिए था, लेकिन कुछ (अधिकांश?) पासवर्ड सिस्टम प्रत्येक पासवर्ड के लिए एक अलग नमक का उपयोग करते हैं, संभवतः पासवर्ड के साथ ही संग्रहीत किया जाता है। इससे एक ही इंद्रधनुष तालिका बेकार हो जाती है। यह है कि यूनिक्स क्रिप्ट लाइब्रेरी कैसे काम करता है, और आधुनिक यूनिक्स जैसे ओएस ने नए हैश एल्गोरिदम के साथ इस लाइब्रेरी को बढ़ाया है।

मैं एक तथ्य के लिए जानता हूं कि GNU क्रिप्ट के नए संस्करणों में SHA-256 और SHA-512 का समर्थन जोड़ा गया था।


17
+1 साल्ट पूर्व-संकलित सूचियों को हैश (इंद्रधनुष तालिकाओं) को उपयोगी होने से रोकता है। हमलावर को फिर से शुरू करना होगा।
इयान बोयड

2
PHP में, आप md5 या sha1 की तुलना में बेहतर एन्क्रिप्शन के लिए mcrypt या bcrypt पुस्तकालयों का उपयोग कर सकते हैं। यदि आप md5 या sha1 के साथ अटके हुए हैं, तो आपको 'स्ट्रेचिंग' करना चाहिए, जहां आपके पास डेटाबेस में जो कुछ भी संग्रहीत है उस पर पहुंचने से पहले पासवर्ड 1000 बार हैश का है। यह एन्ट्रापी को समान रखता है, लेकिन हैश की गणना करने के लिए समय बढ़ाता है।
मालफिस्ट

2
@ उल गुलेन, आप कौन से लेख पढ़ रहे हैं? स्व-सिद्ध विशेषज्ञ या सहकर्मी ने एक वैज्ञानिक पत्रिका में लेखों की समीक्षा की?
मालफिस्ट

7
और यह आपका औसत जो डेवलपर उन ब्लॉग / हेल्प पोस्ट को "सुरक्षित" सिस्टम लिखने के तरीके पर बना रहा है। सुरक्षा ऐसी कोई चीज़ नहीं है जिसे आप उठा सकते हैं, इसके लिए व्यापक ज्ञान की आवश्यकता होती है। क्या यह अनुचित है? शायद। क्या ये सुरक्षित है? एक स्तर तक। सुरक्षा विशेषज्ञ हैं, इसके कारण हैं। लेकिन तब फिर से, सब कुछ फोर्ट नॉक्स जितना सुरक्षित नहीं होना चाहिए। यहां सबसे अच्छी नीति उन विशेषज्ञों द्वारा डिज़ाइन की गई एक पूर्वनिर्मित प्रणाली का उपयोग करना है, और इसे अपनी आवश्यकताओं को पूरा करने के लिए संशोधित करना है।
मालफिस्ट 15

3
@ मिचेल: एक लंबे समय तक नमक के साथ, आपको सभी संभावित नमक मूल्यों को पूर्ववर्ती करने की आवश्यकता है, इसके लिए इंद्रधनुष की मेज में दिखाई देना चाहिए। मुद्दा यह है कि आप सभी पासवर्डों के लिए समान नमक नहीं रखते हैं, आप इसे प्रत्येक पासवर्ड के लिए यादृच्छिक रूप से चुनते हैं, और संग्रहीत हैशेड-नमकीन पासवर्ड के बगल में डेटाबेस में संग्रहीत करते हैं। इसलिए, एक हैकर को प्रत्येक संभावित बड़े मूल्य वाले नमक के लिए इंद्रधनुष तालिका में एक प्रविष्टि की आवश्यकता होगी, जिससे तालिका बहुत बड़ी हो सकती है, जो कि संभव है।
कॉलिन डेक्ले

31

अधिक सटीक होने के लिए, एक शब्दकोश हमला , यानी एक ऐसा हमला जिसमें एक संपूर्ण सूची में सभी शब्दों को आज़माया जाता है, "असंभव" नहीं होता है, लेकिन यह अव्यावहारिक हो जाता है : प्रत्येक बिट नमक भंडारण और गणना की मात्रा को दोगुना करता है

यह पूर्व-संकलित शब्दकोश के हमलों से अलग है जैसे कि इंद्रधनुष तालिकाओं से जुड़े हमले जहां यह मायने नहीं रखता कि नमक गुप्त है या नहीं।

उदाहरण: 64-बिट नमक (यानी 8 बाइट्स) के साथ आपको अपने शब्दकोश हमले में 2 64 अतिरिक्त पासवर्ड संयोजनों की जांच करने की आवश्यकता है । 200,000 शब्दों वाले एक शब्दकोश के साथ आपको बनाना होगा

200,000 * 2 64 = 3.69 * 10 24

सबसे खराब स्थिति में परीक्षण - नमक के बिना 200,000 परीक्षणों के बजाय।

नमक का उपयोग करने का एक अतिरिक्त लाभ यह है कि एक हमलावर अपने शब्दकोश से पासवर्ड हैश की पूर्व-गणना नहीं कर सकता है। यह बस बहुत अधिक समय और / या स्थान लेगा।

अपडेट करें

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

अपडेट २

सामान्य रूप से अपने पासवर्ड हैश को सुरक्षित रखने के मामले पर एक अच्छा पढ़ा (मूल प्रश्न से परे लेकिन अभी भी दिलचस्प है) -

इंद्रधनुष टेबल्स के साथ पर्याप्त: क्या आप सुरक्षित पासवर्ड योजनाओं के बारे में पता करने की आवश्यकता है

लेख का दायरा: bcrypt (ब्लोफिश पर आधारित) या Eksblowfish के साथ बनाई गई नमकीन हैश का उपयोग करें जो आपको हैशिंग को धीमा करने के लिए एक विन्यास योग्य सेटअप समय का उपयोग करने की अनुमति देता है।


4
@ टॉम गुलेन - उचित मजबूत पासवर्ड नीतियों के साथ, सैकड़ों लाखों या कुछ अरब उम्मीदवारों के शब्दकोश में भी कुछ हिट मिलने की संभावना है, क्योंकि सभी पासवर्ड समान रूप से संभव नहीं हैं (क्योंकि लोग आरएनजी के बजाय mnemonics का उपयोग करते हैं, उन्हें चुनने के लिए) । यदि नमक का उपयोग नहीं किया जाता है, तो उस आकार का एक शब्दकोश कमोडिटी सिस्टम पर प्रचलित है। यदि नमक का उपयोग किया जाता है, तो हमलावर को हर बार हैश को फिर से चलाना पड़ता है, और यदि हैश के पर्याप्त पुनरावृत्तियों का प्रदर्शन किया जाता है, तो हमलावर की दर प्रति सेकंड कुछ प्रयासों तक धीमी हो सकती है।
एरिक्सन

3
मेरे से -1: गुप्त रखा जाना पूरी तरह से लवण की बात नहीं है। आपको पासवर्ड की जाँच के लिए वैसे भी उन्हें सुलभ होना चाहिए, इसलिए उन्हें गुप्त रखने के किसी भी प्रयास से सिस्टम को वास्तव में सफल होने के बजाय जोड़े गए जटिलता के माध्यम से अधिक संवेदनशील बनाने की संभावना है।
माइकल बोर्गवर्ड

2
@ 0xA3: फिर से: एक हमलावर के लिए अज्ञात होना एक नमक की बात नहीं है । आपकी मशीन को इसे किसी तरह से एक्सेस करने की आवश्यकता है, इसलिए एक हमलावर जो मशीन में टूट जाता है, उसे भी मिल सकता है। किसी भी परिदृश्य में जहां हमलावर को पता नहीं है कि नमक एक लाल हेरिंग है।
माइकल बोरगवर्ड

1
मुझे लगता है कि यह उल्लेख के लायक है कि जुड़ा हुआ लेख इंद्रधनुषी तालिकाओं का गलत वर्णन करता है। वह जो वर्णन करता है वह एक सरल शब्दकोश संलग्न है। रेनबो टेबल वास्तव में काफी अलग हैं (और कुछ हद तक अधिक जटिल)। इंद्रधनुष तालिकाएँ वास्तव में कैसे काम करती हैं, इसकी एक बहुत अच्छी व्याख्या है : kestas.kuliukas.com/RainbowTables
जेरी कॉफ़िन

3
-1 के लिए "बेशक नमक को गुप्त रखने की जरूरत है"। यदि किसी हमलावर के पास आपके पासवर्ड हैश तक पहुंच है, तो आपके पास आपके लवण भी होंगे - आपको प्रति उपयोगकर्ता लवण की आवश्यकता है, न कि "छिपी हुई" नमक की अस्पष्टता के माध्यम से सुरक्षा।
स्नोमार्क

17

एक शब्दकोश एक संरचना है जहां मूल्यों को कुंजी द्वारा अनुक्रमित किया जाता है। एक पूर्व-गणना शब्दकोश हमले के मामले में, प्रत्येक कुंजी एक हैश है, और संबंधित मूल्य एक पासवर्ड है जो हैश में परिणाम देता है। हाथ में पूर्व-संकलित शब्दकोश के साथ, एक हमलावर एक पासवर्ड को "तुरंत" खोज सकता है जो लॉग में प्रवेश करने के लिए आवश्यक हैश का उत्पादन करेगा।

नमक के साथ, शब्दकोश को संग्रहीत करने के लिए आवश्यक स्थान तेजी से बढ़ता है ... इतनी तेज़ी से, कि पासवर्ड शब्दकोश की पूर्व-गणना करने की कोशिश जल्द ही व्यर्थ हो जाती है।

सबसे अच्छा लवण बेतरतीब ढंग से एक क्रिप्टोग्राफिक यादृच्छिक संख्या जनरेटर से चुना जाता है। आठ बाइट्स एक व्यावहारिक आकार है, और 16 बाइट्स से अधिक कोई उद्देश्य नहीं है।


नमक सिर्फ "हमलावर के काम को और अधिक परेशान करता है" की तुलना में बहुत अधिक करता है। यह हमले के एक पूरे वर्ग को समाप्त कर देता है - पूर्वनिर्मित शब्दकोशों का उपयोग।

पासवर्ड को पूरी तरह से सुरक्षित करने के लिए एक और तत्व आवश्यक है, और वह है "कुंजी-मजबूत करना।" SHA-1 का एक राउंड काफी अच्छा नहीं है: एक सुरक्षित पासवर्ड हैशिंग एल्गोरिथ्म कम्प्यूटेशनल रूप से बहुत धीमा होना चाहिए ।

कई लोग PBKDF2 का उपयोग करते हैं, जो एक प्रमुख व्युत्पन्न कार्य है, जो हजारों बार हैश फ़ंक्शन को वापस परिणाम देता है । "Bcrypt" एल्गोरिथ्म समान है, धीमे चलने वाले कुंजी व्युत्पत्ति का उपयोग करके।

जब हैशिंग ऑपरेशन बहुत धीमा होता है, तो एक हमलावर के लिए एक पूर्व-निर्मित तालिका अधिक से अधिक वांछनीय हो जाती है। लेकिन उचित नमक उस दृष्टिकोण को हरा देता है।


टिप्पणियाँ

नीचे टिप्पणी पर किए गए प्रश्न हैं।


नमक के बिना, एक हमलावर "अपडेट 2" में प्रदर्शित विधि का उपयोग नहीं करेगा। वह पूर्व-गणना की गई तालिका में केवल एक लुकअप करेगा और पासवर्ड को O (1) या O (लॉग एन) समय (उम्मीदवार पासवर्ड की संख्या होने के नाते) प्राप्त करेगा। नमक वह है जो उसे रोकता है और उसे "अपडेट 2" में दिखाए गए ओ (एन) दृष्टिकोण का उपयोग करने के लिए मजबूर करता है।

एक बार एक ओ (एन) हमले के लिए कम हो जाने पर, हमें विचार करना होगा कि प्रत्येक प्रयास में कितना समय लगता है। की-स्ट्रेंथिंग लूप में प्रत्येक प्रयास को पूरी तरह से लेने का कारण बन सकता है, जिसका अर्थ है कि 10k उपयोगकर्ताओं पर 10k पासवर्ड का परीक्षण करने के लिए आवश्यक समय 3 दिन से 3 साल तक बढ़ जाएगा ... और केवल 10k पासवर्ड के साथ, आपको शून्य दरार करने की संभावना है उस समय में पासवर्ड।

आपको यह विचार करना होगा कि एक हमलावर सबसे तेज़ उपकरण का उपयोग करने जा रहा है, न कि PHP, इसलिए 100 के बजाय हजारों पुनरावृत्तियों, कुंजी-मजबूती के लिए एक अच्छा पैरामीटर होगा। यह एक पासवर्ड के लिए हैश की गणना करने के लिए एक दूसरे का एक बड़ा अंश लेना चाहिए।

की-स्ट्रेंथ पीकेसीएस # 5 से मानक कुंजी व्युत्पत्ति एल्गोरिदम पीबीकेडीएफ 1 और पीबीकेडीएफ 2 का हिस्सा है, जो कि शानदार पासवर्ड ऑब्सफिकेशन एल्गोरिदम बनाते हैं ("व्युत्पन्न कुंजी" हैश "है)।

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


बेशक आप मानते हैं कि हमलावर के पास सब कुछ है: नमक, हैश, उपयोगकर्ता नाम। मान लें कि हमलावर एक भ्रष्ट होस्टिंग कंपनी कर्मचारी है, जिसने आपके myprettypony.com के फैंटेसी पर उपयोगकर्ता तालिका को फेंक दिया है। वह इन पासवर्डों को पुनर्प्राप्त करने का प्रयास कर रहा है क्योंकि वह चारों ओर घूमने जा रहा है और देखें कि क्या आपके टट्टू प्रशंसकों ने उनके citibank.com खातों पर एक ही पासवर्ड का उपयोग किया है।

एक अच्छी तरह से डिज़ाइन की गई पासवर्ड योजना के साथ, इस लड़के के लिए किसी भी पासवर्ड को पुनर्प्राप्त करना असंभव होगा ।


1
मुझे लगता है कि "डिक्शनरी अटैक" से, टॉम को ज्ञात कमजोर पासवर्ड (यानी एक मानव भाषा शब्दकोश से सीधे बाहर) की कोशिश करने के लिए संदर्भित किया जाता है, न कि पूर्ववर्ती हैश-प्लेनटेक्स्ट टेबल - यह वही है जो मैं पहली बार "डिक्शनरी" पढ़ता हूं। यह प्रसंग।
माइकल बोर्गवर्ड

@ मिचेल बोर्गवर्ड: मैं सहमत हूं, @erickson पूर्व-संकलित शब्दकोश हमलों को संदर्भित करता है।
डर्क वोल्मार

1
नमक पूर्व-गणना शब्दकोश हमलों को रोकता है। की-स्ट्रेंथ डिक्शनरी अटैक अटैक। सुरक्षित पासवर्ड प्रमाणीकरण के लिए दोनों का एक साथ उपयोग किया जाना चाहिए।
एरिक्सन

मेरा मतलब सादे अंग्रेजी तालिकाओं से है। इस सवाल का उद्देश्य प्रत्येक उपयोगकर्ता खाते के लिए हैश के सभी संभावित संयोजनों को काम करने वाले हैकर को कैसे रोकना है, इस समस्या से निपटने के लिए
टॉम गुलन 16

7

सलामी की बात हमलावर के प्रयास के परिशोधन को रोकना है।

बिना नमक के, पूर्व-निर्मित हैश-पासवर्ड प्रविष्टियों की एक एकल तालिका (उदाहरण के लिए अल्फ़ान्यूमेरिक 5 वर्ण स्ट्रिंग्स का एमडी 5, ऑनलाइन खोजने में आसान) का उपयोग दुनिया के प्रत्येक डेटाबेस में प्रत्येक उपयोगकर्ता पर किया जा सकता है।

साइट-विशिष्ट नमक के साथ, हमलावर को तालिका की गणना स्वयं करनी होती है और फिर साइट के सभी उपयोगकर्ताओं पर इसका उपयोग कर सकते हैं।

प्रति उपयोगकर्ता नमक के साथ, हमलावर को हर उपयोगकर्ता के लिए इस प्रयास को अलग से खर्च करना होगा।

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


1
लघु और सटीक उत्तर - बिना नमक के या साइट-वाइड नमक के साथ, आप आसानी से एक ही पासवर्ड के साथ उपयोगकर्ताओं को हाजिर कर सकते हैं, और केवल एक को मजबूर करने की आवश्यकता होगी। प्रति उपयोगकर्ता लवण के साथ, आप ऐसा नहीं कर सकते।
स्नाइमर

6

इसके अलावा - एक और अभेद्य बिंदु - एक USER- विशिष्ट नमक का उपयोग करना SAME पासवर्ड वाले दो उपयोगकर्ताओं का पता लगाने से रोकता है - उनका हैश मैच होगा। इसीलिए कई बार हैश हैश (नमक + उपयोगकर्ता नाम + पासवर्ड)

यदि आप कोशिश करते हैं और हैश को गुप्त रखते हैं तो हमलावर भी हैश को सत्यापित नहीं कर सकता है।

संपादित करें- बस मुख्य बिंदु ऊपर टिप्पणी में बनाया गया था।


1
आपको प्रति उपयोगकर्ता नमक निर्दिष्ट करने के लिए संपादित करना चाहिए; साइट-वाइड नमक का उपयोग करने वाली साइटें अभी भी आपको समान पासवर्ड का पता लगाने की अनुमति देंगी।
स्नूमर

@ सिनेमार्क - हां- इस महत्वपूर्ण अंतर के लिए बहुत-बहुत धन्यवाद!
डोमिनिक वेबर

5

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

तो हम कहते हैं कि हम SHA1 के साथ काम कर रहे हैं, इस अहंकार के साथ हाल ही में किए गए कारनामों का लाभ उठाते हैं, और हम कहते हैं कि हमारे पास 1,000,000 हैश / सेकंड में चलने वाला एक कंप्यूटर है, एक टक्कर को खोजने में 5.3 मिलियन मिलियन वर्ष लगेंगे , इसलिए हाँ php काम कर सकते हैं 300 एक दूसरे, बड़ी woop, वास्तव में कोई फर्क नहीं पड़ता। हम नमक का कारण यह है कि अगर किसी ने सभी सामान्य शब्दकोश वाक्यांशों को उत्पन्न करने के लिए परेशान किया, (2 ^ 160 लोग, 2007 युग के कारनामों में आपका स्वागत है)।

तो यहां एक वास्तविक डेटाबेस है, जिसमें 2 उपयोगकर्ता हैं जो मैं परीक्षण और व्यवस्थापक उद्देश्यों के लिए उपयोग करता हूं।

RegistrationTime        UserName        UserPass    
1280185359.365591       briang      a50b63e927b3aebfc20cd783e0fc5321b0e5e8b5
1281546174.065087       test        5872548f2abfef8cb729cac14bc979462798d023

वास्तव में, नमस्कार योजना आपकी sha1 (पंजीकरण समय + उपयोगकर्ता नाम) है। आगे बढ़ो, मुझे अपना पासवर्ड बताओ, ये उत्पादन में असली पासवर्ड हैं। तुम भी वहाँ बैठ सकते हैं और php में एक शब्द सूची को हैश कर सकते हैं। जंगली बनो।

मैं पागल नहीं हूं, मुझे सिर्फ इतना पता है कि यह सुरक्षित है। मज़े के लिए, परीक्षण का पासवर्ड है testsha1(sha1(1281546174.065087 + test) + test) = 5872548f2abfef8cb729cac14bc979462798d023

आप के साथ perpended एक पूरे रेनबो टेबल उत्पन्न करने के लिए की आवश्यकता होगी 27662aee8eee1cb5ab4917b09bdba31d091ab732के लिए सिर्फ इस प्रयोक्ता। इसका मतलब है कि मैं वास्तव में अपने पासवर्ड को सभी को एक ही इंद्रधनुष तालिका से समझौता नहीं करने की अनुमति दे सकता हूं, हैकर को परीक्षण के लिए 27662aee8eee1cb5ab4917b09bdba31d91ab732 के लिए एक पूरी इंद्रधनुष तालिका बनाने की आवश्यकता है, और फिर से f3f7735311217529f02800580088002800480028005800280048002 की जरूरत है। सभी हैश के लिए 5.3 मिलियन मिलियन वर्षों के लिए वापस सोचो। केवल 2 ^ 80 हैश के भंडारण के आकार के बारे में सोचें (यह अच्छी तरह से 20 yottabytes से अधिक है ), ऐसा होने वाला नहीं है।

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


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

अपने पैसे वहां डालो जहां तुम्हारा मुंह है?
इनकॉगनिटो

ज़रूर, लेकिन आपने मुझे बताया कि पासवर्ड आपके उदाहरण में क्या है, मुझे एक नमक, हैशेड पासवर्ड दें और आप नमक + पासवर्ड (गैर पुनरावर्ती) का संयोजन कैसे करें और जब तक पासवर्ड <= 5 लोअरकेस अल्फ़ान्यूमेरिक वर्ण (कोई व्हाट्सएप / नहीं) विशेष वर्ण) मैं आपको बताऊंगा कि इस बॉक्स में क्या है। यदि आप चाहते हैं कि आप मेरे सुझाव के अनुसार इस पर पैसा लगाएं, तो मुझे बताएं, हालांकि कुछ मिनटों की मेरी टिप्पणी संभवत: घोर कमतर है, लेकिन घंटों के भीतर हां।
टॉम गुलेन

1
शायद कुछ सेकंड वास्तव में, golubev.com/hashgpu.htm देखें जो "2300M / s SHA1 हैश प्रति सेकंड" के रूप में गणना करने के लिए GPU का उपयोग करता है। 95 ASCII वर्णों की एक पूरी श्रृंखला के साथ 1-6 वर्णों से हम इसे 6 मिनट में क्रैक कर सकते हैं। यदि हमारे पास केवल अल्फ़ान्यूमेरिक वर्ण हैं, तो लंबाई में 8 वर्ण <25 मिनट हैं। 10,000 उपयोगकर्ता रिकॉर्ड के डेटाबेस के साथ, हम सभी 4 चार पूर्ण ASCII पासवर्ड <200 सेकंड (((95 ^ 4) / 2300000000) / 2) * 10000 में पा सकते हैं। (उद्धृत, और उद्धृत GPU गति से अधिक ओवरहेड शायद आदर्श परिस्थितियां हैं)।
टॉम गुलेन

हाँ, नमस्कार आपको उस पासवर्ड को बल देने में सक्षम होने से नहीं रोकता है। यदि आपके पास 10-वर्ण पासवर्ड है, जो बिना राख के 10 ^ 19 की तुलना में बहुत कठिन है, तो ((10 ^ 5) * (94 ^ 10) = 10 ^ 24 उत्पन्न करना आपके लिए कठिन हो जाता है। फिर से, एक पासवर्ड को तोड़ना कठिन नहीं है, यह एक पूर्व-संसाधित इंद्रधनुष तालिका के साथ सभी पासवर्डों को तोड़ने योग्य बनाना है। (और यहां मेरे गणित की जांच करें, लेकिन मेरा मानना ​​है कि 10 ^ 25/2300000000/60/60/24/365/1000 = 137 869 ~ हर किसी के पासवर्ड के लिए मिलिनिया)। यदि हम मजबूत पासवर्ड चाहते हैं तो हम उन्हें नमक नहीं देते हैं, हम डिफी-हेलमैन कुंजी विनिमय जैसी चीजों का उपयोग करते हैं।
गुप्त

3

शब्दकोश हमले के पीछे विचार यह है कि आप एक हैश लेते हैं और पासवर्ड ढूंढते हैं, जिससे यह हैश की गणना की गई, बिना हैश गणना के। अब नमकीन पासवर्ड के साथ भी ऐसा ही करें - आप नहीं कर सकते।

नमक का उपयोग नहीं करने से डेटाबेस में लुकअप के रूप में पासवर्ड खोज आसान हो जाती है। एक नमक बनाने वाले हमलावर का प्रदर्शन सभी संभावित पासवर्डों की हैश गणना करना (यहां तक ​​कि शब्दकोश के लिए यह अटैक के समय को काफी बढ़ा देता है)।


ओपी के परिदृश्य में, हमलावर के पास डेटाबेस से लवण हैं, और "डिक्शनरी" में हर प्रविष्टि के साथ हर नमक की कोशिश करनी होगी। ...मुझे लगता है।
FrustratedWithFormsDesigner

2

सरल शब्दों में: बिना सलामी दिए, प्रत्येक अभ्यर्थी के पासवर्ड को हर उपयोगकर्ता के खिलाफ जांचने के लिए केवल एक बार हैशेड की आवश्यकता होती है, कहीं भी "ज्ञात ब्रह्मांड" (समझौता किए गए डेटाबेस का संग्रह), जिसका पासवर्ड उसी एल्गोरिथ्म के माध्यम से हैशेड है। नमस्कार के साथ, यदि संभावित नमक मूल्यों की संख्या "ज्ञात ब्रह्मांड" में उपयोगकर्ताओं की संख्या से अधिक है, तो प्रत्येक उम्मीदवार पासवर्ड को प्रत्येक उपयोगकर्ता के लिए अलग से हैश किया जाना चाहिए, जिसके खिलाफ उसका परीक्षण किया जाएगा।


2

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


1

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

अब कल्पना करें कि db में प्रत्येक पासवर्ड को कई यादृच्छिक वर्णों के लंबे यादृच्छिक मूल्य के साथ नमकीन किया गया है। अब "1" का आपका घटिया पासवर्ड db में 1 प्लस के यादृच्छिक वर्णों (नमक) के एक समूह के रूप में संग्रहीत किया गया है, इसलिए इस उदाहरण में इंद्रधनुष तालिका को कुछ के लिए हैश की आवश्यकता है: 1।

तो यह मानकर कि आपका नमक कुछ सुरक्षित और बेतरतीब है, मान लीजिए कि ()% ISLDGHASKLU ( % #% #), हैकर की इंद्रधनुष तालिका में 1 * ()% ISLDGHASKLU (*% #% #) के लिए प्रविष्टि की आवश्यकता होगी। अब एक इंद्रधनुष तालिका का उपयोग करें। इस सरल पासवर्ड पर भी अब व्यावहारिक नहीं है।


कृपया अपडेट # 2 देखें, आपके पास बस कच्चे पासवर्ड होंगे और प्रत्येक उपयोगकर्ता रिकॉर्ड के लिए लवण के खिलाफ सभी हैश की गणना करेंगे।
टॉम गुलेन

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

3
@ टोम गुलेन: साइट-वाइड साल्ट का उपयोग करने पर नमकीन इंद्रधनुष टेबल बनाना केवल संभव है; प्रति उपयोगकर्ता नमस्कार इंद्रधनुष तालिका हमलों को बहुत बेकार बना देता है।
स्नूकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.