टिप्पणियों में बातचीत के अनुसार, आपका मतलब हैशिंग . है पासवर्ड, एन्क्रिप्टिंग नहीं पासवर्ड। रेनबो टेबल अटैक को रोकने के लिए आप आमतौर पर नमक के साथ ऐसा करेंगे। जब डेटाबेस में पासवर्ड संग्रहीत करने की बात आती है तो पासवर्ड को नमकीन हैश के रूप में संग्रहीत करना सबसे अच्छा अभ्यास मानक है।
संस्करण 3.2 के अनुसार, MongoDB के पास पासवर्ड हैशिंग के लिए कोई मूल समर्थन नहीं है जैसे कुछ SQL डेटाबेस प्रदान करते हैं, इसलिए आपको इसे जावा में लागू करना होगा।
नया खाता बनाने या मौजूदा खाते का पासवर्ड बदलने के लिए:
- के साथ क्रिप्टोग्राफ़िक रूप से सुरक्षित रैंडम सॉल्ट मान जेनरेट करें
java.security.SecureRandom
. यह वर्ग मानक यादृच्छिक संख्या जनरेटर की तरह काम करता हैjava.util.Random
(यह एक उपवर्ग है) लेकिन सुरक्षा-प्रासंगिक संदर्भ के लिए आवश्यक गैर-पूर्वानुमान के उच्च स्तर के लिए प्रदर्शन का व्यापार करता है। - नमक और पासवर्ड को जोड़कर एक स्ट्रिंग बनाएं
- क्रिप्टोग्राफ़िक रूप से सुरक्षित हैश फ़ंक्शन के साथ उस स्ट्रिंग का हैश जेनरेट करें। जावा आउट-ऑफ-द-बॉक्स द्वारा प्रदान किए गए कई हैश फ़ंक्शन हैं, लेकिन आप एक का उपयोग करना चाहते हैं जो जानबूझकर गणना करने के लिए एक हमलावर को धीमा करने के लिए डेटाबेस एक्सेस के साथ अपने स्थानीय सुपरकंप्यूटर क्लस्टर पर अपने हैश को जबरदस्ती करने की कोशिश कर रहा है। एक अच्छा उम्मीदवार "PBKDF2WithHmacSHA1" एल्गोरिदम है जो
javax.crypto.SecretKeyFactory
कक्षा। - दस्तावेज़ को MongoDB में
username
फ़ील्ड के साथ सहेजें ,password_hash
औरpassword_salt
(साथ ही आपका वास्तविक एप्लिकेशन डेटा, निश्चित रूप से)। मूल पासवर्ड सेव न करें।
खाता पुनः प्राप्त करने के लिए:
username_input
पढ़ें औरpassword_input
कथित उपयोगकर्ता ने आपके लॉगिन फ़ॉर्म में प्रवेश किया है।- दस्तावेज़ को पुनः प्राप्त करें जहाँ
username
username_input
. से मेल खाता है उपयोगकर्ता द्वारा प्रदान किया गया। password_salt
प्राप्त करें उस दस्तावेज़ से फ़ील्डpassword_salt
. को जोड़कर एक स्ट्रिंग बनाएं औरpassword_input
जैसा आपने पहले किया था।- उसी क्रिप्टोग्राफ़िक रूप से सुरक्षित हैश फ़ंक्शन के साथ उस स्ट्रिंग का हैश जेनरेट करें।
- हैश की तुलना
password_hash
से करें दस्तावेज़ का क्षेत्र। जब यह मेल खाता है, तो उपयोगकर्ता ने सही पासवर्ड दर्ज किया।
आप वैकल्पिक रूप से केवल दस्तावेज़ के पासवर्ड_हैश और पासवर्ड_साल्ट फ़ील्ड को पुनः प्राप्त कर सकते हैं और उपयोगकर्ता के प्रमाणीकृत होने से पहले बाकी को लोड नहीं कर सकते हैं, लेकिन मुझे लगता है कि वास्तविक दुनिया में इससे अधिक लोड होगा जो इसे बचाएगा। सफल लॉगिन आमतौर पर असफल लोगों से बहुत अधिक होंगे, जब तक कि आपके पास कोई हमलावर न हो जो किसी खाते को क्रूर-बल देने का प्रयास करता हो। और उस स्थिति में आप हमलावर को fail2ban से ब्लॉक कर देंगे। या अन्य लॉगिन-सीमित तंत्र।