मैं Rfc2898DeriveBytes
का उपयोग कर रहा हूं ताकि उपयोगकर्ता द्वारा आपूर्ति किए गए स्ट्रिंग पासवर्ड से एन्क्रिप्शन कुंजी और प्रारंभिक वेक्टर उत्पन्न हो सके, सममित एन्क्रिप्शन (उदा। एस्मानेड) के साथ उपयोग करने के लिए।पासवर्ड स्ट्रिंग से एन्क्रिप्शन कुंजी और IV प्राप्त करते समय नमक के रूप में पासवर्ड के SHA1 हैश का उपयोग करना ठीक है?
मैं Rfc2898DeriveBytes
पर नमक पैरामीटर के रूप में पासवर्ड का SHA1 हैश ले रहा हूं। क्या वह ठीक है? यदि नहीं, तो मुझे नमक कहाँ से मिलना चाहिए? डिक्रिप्ट करते समय मुझे उसी नमक की आवश्यकता होगी, है ना? इसलिए मुझे इसे कहीं भी अनएन्क्रिप्टेड स्टोर करना है - असुरक्षित। अगर मुझे इसे सुरक्षित रूप से स्टोर करना है, तो यह सिर्फ एक और "पासवर्ड" बन जाता है, है ना?
void SecureDeriveKeyAndIvFromPassword(string password, int iterations,
int keySize, int ivSize, out byte[] key, out byte[] iv)
{
// Generate the salt from password:
byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password));
// Derive key and IV bytes from password:
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations);
key = derivedBytes.GetBytes(keySize);
iv = derivedBytes.GetBytes(ivSize);
}
मैंने निरंतर (हार्ड-कोडित) नमक का उपयोग करके देखा है, और मैंने लोगों को इसके बारे में शिकायत देखी है। मैंने सोचा कि पासवर्ड से नमक निकालना बेहतर विचार होगा, लेकिन मुझे यकीन नहीं है कि यह एक इष्टतम समाधान है।
संक्षेप में, मेरे पास एक फ़ाइल है जिसे एन्क्रिप्ट किया जाना चाहिए, और उपयोगकर्ता द्वारा पासवर्ड स्ट्रिंग इनपुट होना चाहिए। सुरक्षित एन्क्रिप्शन कुंजी और IV प्राप्त करने के लिए मैं Rfc2898DeriveBytes
का सही तरीके से उपयोग कैसे करूं?
धन्यवाद।
संपादित करें:
अपने जवाब के लिए धन्यवाद। अब मैं समझता हूं कि नमक का मुख्य (शायद केवल?) उद्देश्य इंद्रधनुष सारणी की पीढ़ी को असंभव बनाना है - आप "पी @ $$ w0rd" के हैश को पूर्व-उत्पन्न नहीं कर सकते हैं क्योंकि प्रत्येक के लिए यह एक अलग हैश होगा नमक मूल्य मैं इसे पूरी तरह से समझता हूं, लेकिन ... क्या यह वास्तव में सममित एन्क्रिप्शन के लिए प्रासंगिक है? मैं कहीं भी हैश को स्टोर नहीं कर रहा हूं? तो अगर हमलावर के पास सभी संभावित पासवर्ड संयोजनों के लिए इंद्रधनुष तालिका है, तो वह ज्यादा नहीं कर सकता है, है ना?
तो, मेरे सवाल है: वहाँ, प्रत्येक सुरक्षित करने का कार्यवाही में यादृच्छिक नमक का उपयोग कर उपयोग की तुलना का कोई विशेष लाभ है पासवर्ड व्युत्पन्न (या हार्ड-कोडेड) नमक, जब सममित एन्क्रिप्शन एल्गोरिदम के साथ प्रयोग किया है (जैसे .NET का प्रबंधन किया गया है)?
पासवर्ड के केवल हैश-मूल्य को स्टोर करना बेहतर है। एन्क्रिप्टेड पासवर्ड के विपरीत, हैश-वैल्यू को उलट नहीं किया जा सकता है, भले ही हमलावर आपके कोड को नियंत्रित करता है और कुंजी जानता है। तो आप पासवर्ड क्यों एन्क्रिप्ट करेंगे (पीबीकेडीएफ 2 एन्क्रिप्शन नहीं है, यह हैशिंग है)? – martinstoeckli
@martinstoeckli, मैं पासवर्ड एन्क्रिप्ट नहीं कर रहा हूं, न ही मैं कहीं भी अपने हैश को संग्रहीत कर रहा हूं। मैं सिर्फ स्ट्रिंग पासवर्ड से एन्क्रिप्शन कुंजी (और iv) प्राप्त करता हूं और उसके बाद पेलोड एन्क्रिप्ट करता हूं। –
मुझे लगता है कि अब मैं समझता हूं। आप पहले पासवर्ड से हैश की गणना करना चाहते हैं और फिर कुछ डेटा एन्क्रिप्ट करने के लिए इस हैश-वैल्यू का उपयोग करें (सीधे मूल पासवर्ड का उपयोग करने के बजाय)। – martinstoeckli