(नोट:मैं कोई सुरक्षा विशेषज्ञ नहीं हूं। मुझे इस क्षेत्र में दिलचस्पी है, लेकिन बस इतना ही। इसे ध्यान में रखें।)
यदि संभव हो, तो पासवर्ड बिल्कुल भी संग्रहित न करें
यह बहुत कुछ इस बात पर निर्भर करता है कि आपकी जरूरतें क्या हैं। सभी का सबसे अच्छा विकल्प दो-तरफा एन्क्रिप्शन का उपयोग बिल्कुल नहीं करना है; अगर आप केवल नमकीन स्टोर कर सकते हैं और one-way-hashed पासवर्ड डाइजेस्ट करता है जो आदर्श है। आप यह देखने के लिए अभी भी उनका परीक्षण कर सकते हैं कि क्या वे उपयोगकर्ता द्वारा दिए गए पासवर्ड से मेल खाते हैं, लेकिन आप इसे कभी भी संग्रहीत नहीं करते हैं।
और भी बेहतर, यदि आपके क्लाइंट कुछ समझदार प्रोटोकॉल का उपयोग करते हैं (अर्थात:सामान्य रूप से लागू HTTP नहीं) तो आप चुनौती-प्रतिक्रिया प्रमाणीकरण तंत्र इसका मतलब है कि आपका ऐप कभी भी कभी नहीं उपयोगकर्ता के पासवर्ड को देखने की जरूरत है, उन्हें प्रमाणित करते समय भी नहीं। अफसोस की बात है कि सार्वजनिक वेब पर यह शायद ही कभी संभव है, जिसमें सुरक्षा है जो 80 के प्रोग्रामर को शर्मिंदा करती है।
अगर आपको पासवर्ड स्टोर करना है, तो ऐप से चाबियों को अलग करें
यदि आप पासवर्ड को डिक्रिप्ट करने में सक्षम होना चाहिए, तो आदर्श रूप से आपके पास एक ही स्थान पर ऐसा करने के लिए सभी विवरण नहीं होने चाहिए, और निश्चित रूप से एक कॉपी करने योग्य, आसानी से सुलभ स्थान नहीं होना चाहिए।
इस कारण से मैं व्यक्तिगत रूप से इस उद्देश्य के लिए PgCrypto (जैसा आप कर रहे हैं) का उपयोग नहीं करना पसंद करूंगा क्योंकि यह आपको सर्वर पर निजी कुंजी और (यदि इसमें एक है) पासफ़्रेज़ प्रकट करने के लिए मजबूर करता है, जहां इसे पोस्टग्रेएसक्यूएल में उजागर किया जा सकता है log फ़ाइलें या अन्यथा संभावित रूप से सूँघी। मैं अपना क्रिप्टो क्लाइंट-साइड करना चाहता हूं, जहां मैं पीकेसीएस # 11, एक प्रमुख एजेंट, या अन्य टूल्स का उपयोग कर सकता हूं जो मुझे कभी भी मेरे कोड को कुंजी तक पहुंचने में सक्षम किए बिना डेटा को डिक्रिप्ट करने देता है।
सुरक्षित कुंजी संग्रहण की समस्या PKCS#11 का हिस्सा है। के लिए आविष्कार किया गया था। यह एप्लिकेशन और क्रिप्टो प्रदाताओं के लिए कुछ भी बात करने के लिए एक सामान्य इंटरफ़ेस प्रदान करता है जो कुछ निश्चित हस्ताक्षर और डिक्रिप्शन सेवाएं प्रदान कर सकता है अपनी कुंजी को कभी भी प्रकट किए बिना . सामान्य, लेकिन न केवल, उपयोग हार्डवेयर आधारित क्रिप्टो जैसे स्मार्ट कार्ड और हार्डवेयर क्रिप्टो मॉड्यूल के साथ होता है। ऐसे उपकरणों से कहा जा सकता है कि वे उन्हें दिए गए डेटा पर हस्ताक्षर या डिक्रिप्ट करें, और बिना चाबी बताए ऐसा कर सकते हैं। यदि संभव हो, तो स्मार्टकार्ड या एचएसएम का उपयोग करने पर विचार करें। जहाँ तक मुझे पता है PgCrypto PKCS#11 या अन्य HSMs/स्मार्टकार्ड का उपयोग नहीं कर सकता।
यदि आप ऐसा नहीं कर सकते हैं, तो आप अभी भी एक कुंजी प्रबंधन एजेंट का उपयोग कर सकते हैं, जहां आप अपनी कुंजी को एक कुंजी प्रबंधन प्रोग्राम में मैन्युअल रूप से लोड करते हैं जब सर्वर बूट होता है, और कुंजी प्रबंधन प्रोग्राम एक PKCS#11 (या कुछ अन्य) इंटरफ़ेस प्रदान करता है। एक सॉकेट के माध्यम से हस्ताक्षर और डिक्रिप्शन के लिए। इस तरह आपके वेब ऐप को कभी भी कुंजी जानने की आवश्यकता नहीं होती है। gpg-agent
इस उद्देश्य के लिए पात्र हो सकते हैं। फिर से, जहां तक मुझे पता है कि PgCrypto एक प्रमुख प्रबंधन एजेंट का उपयोग नहीं कर सकता है, हालांकि यह जोड़ने के लिए एक अच्छी सुविधा होगी।
एक छोटा सा सुधार भी मदद कर सकता है। यदि आपकी कुंजी के लिए पासफ़्रेज़ डिस्क पर संग्रहीत नहीं है, तो यह सबसे अच्छा है, इसलिए ऐप शुरू होने पर आपको इसे दर्ज करने की आवश्यकता हो सकती है ताकि कुंजी को डिक्रिप्ट किया जा सके। आप अभी भी डिक्रिप्ट की गई कुंजी को मेमोरी में संग्रहीत कर रहे हैं, लेकिन इसे डिक्रिप्ट करने के लिए सभी विवरण अब डिस्क पर नहीं हैं और इसे प्राप्त करना आसान है। डिस्क से "password.txt" हथियाने की तुलना में एक हमलावर के लिए स्मृति से डिक्रिप्ट की गई कुंजी को चुराना बहुत कठिन है।
आप जो करना चुनते हैं वह आपकी सुरक्षा आवश्यकताओं के विवरण और उस डेटा पर निर्भर करता है जिसके साथ आप काम कर रहे हैं। यदि संभव हो तो मैं आपकी स्थिति में पासवर्ड संग्रहीत नहीं करता, और यदि मुझे करना होता तो मैं एक PKCS#11-संगत हार्डवेयर उपकरण का उपयोग करना चाहता।