2011-01-04 15 views
7

तो यह मूल रूप से एक आश्वासन है कि मैं पूरी पंजीकरण/लॉगिन प्रक्रिया को जहां तक ​​हैशिंग/नमकीन चला रहा हूं।हैशिंग और सल्टिंग - लॉगिन w/कुकीज़ को मान्य करना

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

hash("sha256", $theirpostpassword.$randomgeneratedsalt); 

यादृच्छिक उत्पन्न नमक और टोकन में उन तालिका में पंक्ति है कि अपने संबंधित क्षेत्रों में जमा हो जाती है यही कारण है कि।

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

अब मैं प्रत्येक पृष्ठ पर उनके लॉगिन को सत्यापित करने के बारे में सोच रहा था, मेरे पास प्रत्येक पृष्ठ पर एक फ़ंक्शन चलाया जाएगा जो यह देखने के लिए उनकी कुकी जांचता है कि आईडी-उपयोगकर्ता नाम-टोकन डेटाबेस में पंक्ति से मेल खाता है या नहीं। मतलब यह है कि प्रत्येक लॉगिन यह उन क्रेडेंशियल्स के साथ अपनी कुकी सेट करता है।

अब केवल एक चीज जिसे मैं बेहतर बनाने के बारे में सोच सकता हूं वह हर वैध लॉगिन टोकन को बदल सकता है?

अंतर्दृष्टि लोगों के लिए धन्यवाद।

+1

मेरे पास टोकन रिमोट यूजर के आईपी पर निर्भर करेगा, लेकिन उस कुकी को चेक-इन जानकारी के साथ- प्रत्येक अनुरोध पर बस ठीक काम करने लगता है। – ncuesta

+1

त्वरित प्रतिक्रिया के लिए धन्यवाद, मैं पूरी तरह आईपी जांच के खिलाफ था क्योंकि मुझे पता है कि कुछ गतिशील आईपी पते हैं जो अक्सर बदलते हैं। –

+0

आपको प्रमाणीकरण प्रणाली स्वयं नहीं बनाना चाहिए क्योंकि बहुत सी चीजें गलत हो सकती हैं। इसके बजाए फेसबुक कनेक्ट/ट्विटर साइन इन/ओपनिड इत्यादि का प्रयोग करें! – Alfred

उत्तर

4

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

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

+1

मैं टोकन के हस्ताक्षर होने से असहमत हूं। आपको टोकन को असहनीय होने की आवश्यकता है और गारंटी देने का एकमात्र तरीका यादृच्छिकता के साथ है। हर तरह से एक हस्ताक्षर भी है, लेकिन एक यादृच्छिक टोकन बहुत महत्वपूर्ण है। –

1

चेकों उनकी कुकी यदि आईडी-उपयोगकर्ता नाम-टोकन के प्रारूप डेटाबेस

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

आप सत्र में प्रमाणीकृत उपयोगकर्ता नाम संग्रहीत करने पर कुछ भी प्राप्त नहीं कर रहे हैं। लेकिन जब आप किसी उपयोगकर्ता को प्रमाणित करते हैं और प्रमाणीकरण टोकन पास करने के लिए SSL का उपयोग करते हैं तो सत्र आईडी बदलें।

2

सुंदर मेरे लिए बहुत अच्छा लगता है, लेकिन आप चीजों की एक जोड़ी के बारे में पता होना चाहिए:

अपना पासवर्ड डेटाबेस जानवर-बल हमलों के लिए प्रतिरोधी बनाने के लिए आप हैश पुनरावृति सकता है:

$hash = $password; 
for ($i = 0; $i < 1000; ++$i) { 
    $hash = hash("sha256", $hash . $salt); 
} 

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

निश्चित रूप से प्रत्येक लॉगिन टोकन को बदलें और सत्र निर्धारण को रोकने और हमले को फिर से चलाने के लिए हर अनुरोध के लिए इसे बदलने पर विचार करें।

आप डेटाबेस से नमक और हैश का चयन भी कर सकते हैं और डेटाबेस में राउंड-ट्रिप की संख्या को कम करने के लिए हैश तुलना सर्वर-पक्ष (डीबी के बजाए) कर सकते हैं।

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

यह सब स्प्रिंग्स दिमाग में है। पासवर्ड पर MD5-ing और डेटाबेस में चिपके रहने की बजाय सलाह मांगने के लिए आप पर अच्छा लगा!

संबंधित मुद्दे