2009-06-28 44 views
362

मैं एक परियोजना प्रमाणीकरण नहीं है पर काम कर रहा हूँ में पासवर्ड स्टोर करने के लिए (उपयोगकर्ता नाम/पारित)सबसे अच्छा तरीका डेटाबेस

यह भी एक डेटाबेस से कनेक्ट करता है तो मैं मैं वहाँ उपयोगकर्ता नाम और पासवर्ड संग्रहीत करेंगे लगा लेकिन ऐसा लगता है कि डीबी

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

+1

जो भी आप करते हैं, यदि आप एन्क्रिप्शन के साथ जाते हैं, तो कोड में कुंजी को पिछले पोस्टर के रूप में संग्रहीत न करें। यह सिर्फ खराब अभ्यास है। – Woody

+5

'पासवर्ड कैसे सही करें?' एक महत्वपूर्ण सवाल है। यह एक कठिन समस्या है और गलतियों के गंभीर परिणाम हैं (याद रखें टेस्को और लिंक्डइन के साथ क्या हुआ)। मुझे लगता है कि http://programmers.stackexchange.com –

+1

पर यह प्रश्न फिर से खोला जाना चाहिए मानकों के साथ रहना बेहतर है - http://en.wikipedia.org/wiki/PBKDF2 देखें आपको केवल अपने कार्यान्वयन को ढूंढना होगा भाषा –

उत्तर

329

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

clari करने के लिए नमक बिट पर थोड़ी देर के लिए, पासवर्ड को आसानी से धोने के साथ खतरा और यह संग्रह करना है कि अगर एक अपराधी को आपके डेटाबेस को पकड़ लिया जाता है, तो वे अभी भी पासवर्ड का "डिक्रिप्ट" करने में सक्षम होने के लिए rainbow tables के रूप में जाने जाते हैं। कम से कम जो इंद्रधनुष तालिका में दिखाई देते हैं)। इसके आस-पास पहुंचने के लिए, डेवलपर्स salt को पासवर्ड में जोड़ते हैं, जो सही तरीके से किए जाने पर इंद्रधनुष के हमलों को आसानी से करने में असमर्थ बनाता है। ध्यान दें कि एक आम गलतफहमी बस सभी पासवर्डों के लिए एक ही अद्वितीय और लंबी स्ट्रिंग जोड़ना है; जबकि यह भयानक नहीं है, हर पासवर्ड में अद्वितीय लवण जोड़ने के लिए सबसे अच्छा है। Read this for more.

+0

@ पाओलो बर्गान्तिनो का उपयोग नहीं कर सकते: "डेटाबेस में पासवर्ड संग्रहीत करना उचित बात है" - मैं उस कथन से असहमत हूं। –

+31

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

+0

@ पाओलो बर्गान्तिनो: मैं समझ गया कि आपका क्या मतलब है। और मैंने इसे संदर्भ से बाहर नहीं लिया। सर्वश्रेष्ठ अभ्यास भी एन्क्रिप्टेड पासवर्ड को स्टोर नहीं करना है, बल्कि एन्क्रिप्टेड पासवर्ड के नमकीन हैश को स्टोर करना है। –

3

(मैं विचार है कि इस जानकारी DB में जमा नहीं किया जा एक अच्छा कारण प्रदान किया जा सकता है, तो के लिए खुला रहा हूँ) मैं करूंगा MD5/SHA1 पासवर्ड अगर आप उल्टा करने के लिए सक्षम होने के लिए की जरूरत नहीं है हैश जब उपयोगकर्ता लॉगिन करते हैं, तो आप केवल दिए गए पासवर्ड को एन्क्रिप्ट कर सकते हैं और इसे हैश से तुलना कर सकते हैं। इस मामले में हैश टकराव लगभग असंभव हैं, जब तक कि किसी को डेटाबेस तक पहुंच प्राप्त न हो और एक हैश को देख सकें, उनके पास पहले से ही टकराव है।

+1

मैं हैशिंग के लिए MD5 का उपयोग नहीं करता - यह मूल रूप से टूटा हुआ http : //www.mscs.dal.ca/~selinger/md5collision/ – zebrabox

+2

वास्तव में, यह टूटा नहीं है। वे क्या कर सकते हैं दो अलग-अलग फाइलों के लिए एक ही हैश मान पाता है। वे क्या नहीं कर सकते हैं एमडी 5 को उलट दें और एक कामकाजी पासवर्ड प्राप्त करें। – waiwai933

+2

ठीक है, तो वह भी तोड़ा नहीं जाएगा? आप बस उसी पासवर्ड को दर्ज करते हैं जो एक ही हैश उत्पन्न करता है, और आप अंदर हैं। आपको मूल पासवर्ड जानने की आवश्यकता नहीं है। इसे ठीक करने का तरीका यह है कि यदि आप हैशिंग से पहले पासवर्ड नमक करते हैं। – mjuarez

3

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

सब कुछ इस प्रयोजनों के लिए, asp.net membership

31

शा -512 जैसे सुरक्षित एल्गोरिदम का उपयोग करके, एक महत्वपूर्ण कठोर नमकीन हैश के रूप में।

+3

मेरी राय में, आपको हमेशा पासवर्ड स्टोर करने के लिए धीमी एल्गोरिदम (उदाहरण के लिए ब्लोफिश) का उपयोग करना चाहिए। यह लेखन एक बेहतर उत्तर है: https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords। बस इसे यहां डालें, क्योंकि यह पृष्ठ अभी भी खोज परिणामों में उच्च दिखाई देता है। – Dynom

+0

पासवर्ड संग्रहण के लिए इस सलाह के बाद यह गलत तरीके से गलत होगा। – mlissner

25

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

इस तरह यह एक सादा टेक्स्ट पासवर्ड पुनर्प्राप्त करना असंभव है (व्यावहारिक रूप से) असंभव है।

+11

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

+11

@Wayne हार्टमैन: ऐसा नहीं है। यदि नमक मूल्य का खुलासा किया जाता है, तो आपको उस विशिष्ट नमक मूल्य के लिए एक नई इंद्रधनुष तालिका उत्पन्न करनी होगी।इंद्रधनुष तालिका का बिंदु हैश मानों को पहले से गणना करना है। और उसके विशिष्ट नमक के लिए कोई भी इंद्रधनुष तालिका नहीं रखेगा। –

40

पृष्ठभूमि आप कभी ... वास्तव में ... उपयोगकर्ता के पासवर्ड को जानने की आवश्यकता नहीं है। आप बस एक आने वाले उपयोगकर्ता को सत्यापित करना चाहते हैं कि खाते के लिए पासवर्ड पता है।

हैश यह: एक मजबूत हैश फ़ंक्शन के माध्यम से उपयोगकर्ता पासवर्ड हैश (एक तरफा एन्क्रिप्शन) स्टोर करें। "सी # एन्क्रिप्ट पासवर्ड" की खोज उदाहरणों का एक भार देती है।

हैश फ़ंक्शन का उत्पादन करने के विचार के लिए online SHA1 hash creator देखें (लेकिन SHA1 को हैश फ़ंक्शन के रूप में उपयोग न करें, SHA256 जैसे कुछ मजबूत उपयोग करें)।

अब, एक हैश किए गए पासवर्ड का अर्थ है कि आप (और डेटाबेस चोर) उस हैश को मूल पासवर्ड में वापस करने में सक्षम नहीं होना चाहिए।

इसका उपयोग कैसे करें: लेकिन, आप कहते हैं, मैं डेटाबेस में संग्रहीत इस मैश किए हुए पासवर्ड का उपयोग कैसे करूं?

जब उपयोगकर्ता लॉग इन करता है, तो वे आपको उपयोगकर्ता नाम और पासवर्ड (इसके मूल पाठ में) सौंपेंगे, आप केवल उसी हैश कोड का उपयोग हैश को संग्रहीत संस्करण प्राप्त करने के लिए टाइप किया गया है।

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

अतिरिक्त क्रेडिट:

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

उत्तर: हाँ ... हाँ वे कर सकते हैं।

तो, आपको अपने पासवर्ड 'नमक' करना चाहिए। देखें Wikipedia article on salt

देखें "How to hash data with salt" C# example

+12

अच्छी बात, एक चीज़ को छोड़कर: md5 और sha1 दोनों टूट गए हैं। आपको शायद एक मजबूत एल्गोरिदम के साथ जाना चाहिए, जैसे शायद SHA2 परिवार। –

+3

धन्यवाद पाओलो - आप सही हैं। एसएचए 2 के उपयोग के रूप में एमडी 5 और एसएचए 1 का उपयोग करने जितना आसान है, कृपया मजबूत हैश एल्गोरिदम का उपयोग करें। – joej

+5

SHA-1 को तोड़ा नहीं गया है। लेकिन ब्रूस शनीयर को पैराफेज करने के लिए: चलो, भागो मत, SHA-2 के लिए। –

6

मैं थोड़ा विषय से हटकर के रूप में आप एक उपयोगकर्ता नाम और पासवर्ड के लिए की जरूरत का उल्लेख किया जा सकता है, और इस मुद्दे की मेरी समझ admitedly सबसे अच्छा नहीं है, लेकिन OpenID कुछ पर विचार के लायक है ?

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

यह उपयुक्त नहीं हो सकता है, तो सवाल में आवेदन आंतरिक उपयोग के लिए विशुद्ध रूप से है, हालांकि

RPX एक आवेदन में OpenID समर्थन intergrate के लिए एक अच्छा आसान तरीका प्रदान करता है।

+0

मैं मानता हूं कि ओपनआईडी चट्टानों का सामना करना पड़ता है लेकिन इस एप्लिकेशन के लिए यह एक कंपनी के लिए घर डेटाबेस में है, मुझे संदेह है कि वे किसी भी पुराने व्यक्ति को लॉग ऑन करने के लिए आना चाहते हैं। इस ऐप के लिए सही ढंग से काम करने के लिए वेब एक्सेस की भी आवश्यकता नहीं है इसलिए मुझे इसकी आवश्यकता नफरत होगी। – Crash893

9

मैं लेख Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes [मृत लिंक, copy at the Internet Archive] और How To Safely Store A Password लेखों को पढ़ने की पूरी तरह से अनुशंसा करता हूं।

बहुत सारे कोडर, स्वयं शामिल हैं, लगता है कि वे सुरक्षा और हैशिंग को समझते हैं। अफसोस की बात है कि हम में से अधिकांश बस नहीं करते हैं।

+3

आलेख 404 देता है। – Johan

+1

@Johan ऐसा लगता है कि लिंक अब टूटा हुआ है जो शर्म की बात है। यहां एक विकल्प है http://codahale.com/how-to-safely-store-a-password/ – zebrabox

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