यह इस बात पर निर्भर करता है कि आप जानकारी के साथ क्या करने जा रहे हैं।
यदि आप कुछ बाहरी सेवा तक पहुंचने के लिए नाम और पासवर्ड का उपयोग करने जा रहे हैं (लेकिन उपयोगकर्ता को अगली बार प्रोग्राम चलाने के बाद जानकारी को पुन: दर्ज करना होगा), तो उन्हें कुछ चरों में संग्रहीत करना ठीक है। उन्हें एन्क्रिप्टेड स्टोर करना बुद्धिमान हो सकता है (कम से कम, पासवर्ड एन्क्रिप्टेड स्टोर करें) ताकि यह कोर डंप या समकक्ष में दिखाई न दे। जब पासवर्ड की आवश्यकता होती है, तो आप इसे डिक्रिप्ट करते हैं, इसका उपयोग करते हैं, और उसके बाद लिखते हैं कि डिक्रिप्ट किए गए संस्करण को संग्रहीत किया गया था (इसे ज़ैप करना)। (नोट: इस संदर्भ में हैशिंग उचित नहीं है; आपको पासवर्ड देखने में सक्षम होना चाहिए, और आप हैश को पूर्ववत नहीं कर सकते हैं।) आप प्रोग्राम के बाहर की जानकारी (डिस्क फ़ाइल में) को स्टोर करने का निर्णय ले सकते हैं, लेकिन यह आवश्यक प्रतीत नहीं होता है। ध्यान दें कि बाइनरी में अभी भी एन्क्रिप्शन कुंजी (और एन्क्रिप्शन एल्गोरिदम) होगा, और एन्क्रिप्टेड डेटा आपके प्रोग्राम की औसत सामग्री से अधिक यादृच्छिक है, इसलिए वास्तव में एन्क्रिप्टेड पासवर्ड को छुपाने के लिए वास्तव में बहुत मुश्किल है (असंभव पर सत्यापन करना)। हालांकि, आप इसे इतना कठिन बना सकते हैं कि यह सबसे निर्धारित हमलावरों के अलावा सभी को रोक देगा।
यदि आप उपयोगकर्ता नाम और पासवर्ड को स्थायी रिकॉर्ड के रूप में स्टोर करने जा रहे हैं ताकि आप मान्य कर सकें कि वही उपयोगकर्ता भविष्य में जानकारी तक पहुंच रहा है, तो आपको प्रोग्राम के बाहर बाहरी संग्रहण का उपयोग करना होगा; आप एक साधारण डेटाबेस का उपयोग करेंगे, जो एक सादे पाठ फ़ाइल के रूप में सरल हो सकता है यदि आप सुनिश्चित करते हैं कि आप किसी भी सहमति के मुद्दों को हल करते हैं। इस मामले में, आप कुछ नमक के साथ पासवर्ड हैश करेंगे, और आप उपयोगकर्ता नाम, नमक और पासवर्ड धोएंगे इस तरह से उपयोगकर्ता नाम दिया गया है, तो आप आसानी से अन्य दो मानों को पा सकते हैं।
रात वाकर की टिप्पणियां:
मैं कुछ वेब डेटाबेस का उपयोग करने के लिए कि पासवर्ड का उपयोग, इसलिए मैं इसे अपने आवेदन में संग्रहीत के बाद यह पहली बार के लिए दर्ज किया गया है की जरूरत है। क्या आप वाकई एक सादा पाठ फ़ाइल है जो एक विचार स्मार्ट है?
यह इस बात पर निर्भर करता है कि आप 'मेरे आवेदन में संग्रहीत' कैसे हैं। आप निष्पादन योग्य संशोधित नहीं कर सकते हैं, या कम से कम ऐसा करने की कोशिश नहीं करनी चाहिए। इसलिए, आपको इसे निष्पादन योग्य एप्लिकेशन से अलग फ़ाइल में संग्रहीत स्थायी रिकॉर्ड के रूप में देखना होगा। दूसरी तरफ, आपको जो कुछ बताया गया है उससे आपको एक अलग समस्या का सामना करना पड़ता है - आप जानकारी के साथ उपयोगकर्ता को प्रमाणित नहीं कर रहे हैं; आपको अन्य अनुप्रयोगों को भेजने के लिए मांग पर जानकारी को डिक्रिप्ट करने की आवश्यकता है।
सबसे पहले, इसका मतलब है कि लवण और हैंश प्रासंगिक नहीं हैं; आपको मास्किंग ऑपरेशन को उलट करने की आवश्यकता है, और आप एक हैश को उलट नहीं सकते हैं।
अगला, आपको यह तय करने की आवश्यकता है कि आप पुन: प्रकट होने पर अपने आवेदन के उपयोगकर्ता की पहचान कैसे करेंगे। क्या उपयोगकर्ता अपने डेटा पर जाने के लिए कुछ पासवर्ड दर्ज करने के लिए बाध्य होगा, या आप बस ऑपरेटिंग सिस्टम विशेषाधिकारों, या किसी अन्य योजना पर भरोसा करेंगे।
यदि उपयोगकर्ता को जाने के लिए आपके आवेदन में कुछ पासवर्ड दर्ज करना होगा, तो आप उपयोगकर्ता नाम को एन्क्रिप्ट करने के लिए उस पासवर्ड का उपयोग कर सकते हैं (या इसका हैश, पासवर्ड हैश से एप्लिकेशन को पहचानने के लिए इस्तेमाल किया गया है)/बाहरी अनुप्रयोग के लिए पासवर्ड संयोजन। फिर आप उपयोगकर्ता नाम और तर्क के लिए, एन्क्रिप्टेड पासवर्ड के बेस -64 एन्कोडेड संस्करण को टेक्स्ट फ़ाइल में संग्रहीत कर सकते हैं; यह एप्लिकेशन पासवर्ड के रूप में सुरक्षित है, जो मूल नमकीन हैश प्रारूप में संग्रहीत है। जब उपयोगकर्ता लौटाता है, तो उन्हें अपना एप्लिकेशन उपयोगकर्ता नाम और पासवर्ड प्रदान करना होता है, और आप संग्रहित मानों के विरुद्ध उस संयोजन को मान्य कर सकते हैं, और फिर बाहरी एप्लिकेशन को पासवर्ड डिक्रिप्ट करने के लिए पासवर्ड का उपयोग कर सकते हैं।
यदि उपयोगकर्ता पासवर्ड दर्ज नहीं करता है, तो आप जो भी कर सकते हैं उसमें आप अधिक प्रतिबंधित हैं। आपको किसी भी तरह से उपलब्ध जानकारी से किसी कुंजी को निर्धारित करने में सक्षम होना चाहिए जिसका उपयोग उपयोगकर्ता के एन्क्रिप्टेड पासवर्ड को किसी प्रतिबंधित स्थान पर फ़ाइल में स्टोर करने के लिए किया जा सकता है जैसे किसी भी समूह या सार्वजनिक पहुंच के साथ अपनी होम निर्देशिका के नीचे उप-निर्देशिका:
mkdir ~/.appname
chmod 700 ~/.appname
cp /dev/null ~/.appname/app.key
...store the encrypted information...
chmod 500 ~/.appname
chmod 400 ~/.appname/app.key
इसका कारण यह है, भले ही आप उपयोगकर्ता के नाम के साथ एक निश्चित कुंजी गठबंधन, कहते हैं, संभावना है कि किसी को बाहर काम कर सकते हैं क्या है कि कुंजी है (और एन्क्रिप्शन प्रौद्योगिकी) और यह विपरीत इंजीनियरिंग कर रहे हैं कम संतोषजनक है। (एन्क्रिप्टेड डेटा की गोपनीयता कुंजी पर निर्भर करती है; जब कुंजी प्रोग्राम द्वारा निर्धारित करने योग्य होती है, तो यह एक निर्धारित हमलावर द्वारा भी निर्धारित किया जा सकता है। यह सबसे अच्छा है, उपयोगकर्ता को कुंजी (या पासवर्ड या क्या MySQL या SQLite के बारे में तो आवेदन कुछ भी है कि एक हमलावर ऑफ़लाइन उपयोग कर सकते हैं की दुकान नहीं है
मैं कुछ वेब डेटाबेस तक पहुंचने के लिए उस पासवर्ड का उपयोग करता हूं, इसलिए मुझे इसे पहली बार दर्ज करने के बाद अपने एप्लिकेशन में संग्रहीत करने की आवश्यकता है। क्या आप वाकई सादे पाठ फ़ाइल को समझते हैं? –
इसलिए मुझे लगता है कि यह स्थायी रिकॉर्ड अब तक का सबसे अच्छा विचार है। एप्लिकेशन में कोई अन्य पासवर्ड नहीं है, और यह मीटर नहीं करता है कि अन्य उपयोगकर्ता उस एप्लिकेशन का उपयोग करेंगे। केवल एक चीज पासवर्ड को सहेजने का प्रयास करना है + अन्य पीपीएल से उपयोगकर्ता नाम। –
हां, कुछ स्थायी फ़ाइल में जानकारी संग्रहीत करना आवश्यक होगा। आवेदन के प्रत्येक उपयोगकर्ता के लिए एक अलग फ़ाइल का उपयोग करें; बेस -64 एन्कोडिंग में एन्क्रिप्टेड पासवर्ड स्टोर करें (इसलिए आपके पास एक सादा पाठ फ़ाइल है)। किसी भी क्रिप्टोग्राफ़िक हैश से एन्क्रिप्शन के लिए उपयोग की जाने वाली कुंजी को उपयोगकर्ता की सबसे भरोसेमंद विशेषताओं (शायद उनके उपयोगकर्ता नाम और उपयोगकर्ता आईडी नंबर का एक संयोजन, और शायद कुछ निश्चित टेक्स्ट) माना जाता है, और सुरक्षित रूप से स्टोर करें एक स्थान जैसा आप तैयार कर सकते हैं। सुरक्षा सही से कम है - आप अपने हमलावरों को तैयार कर सकते हैं जो खोज सकते हैं। –