मेरे पास एक संदेश है कि मैं अपने आप को पास कर रहा हूं जो कि मध्य-मध्य-मध्य हमलों के अधीन होगा। इसके कारण, मैं उस संदेश के अखंडता के बारे में चिंतित हूं जब मैं इसे भेजता हूं, और जिस समय मैं इसे वापस प्राप्त करता हूं।संदेश अखंडता को बनाए रखना
यह माना जाना चाहिए कि एक बार जब मैं स्वयं को संदेश भेजता हूं, तो भेजे गए संदेश के बारे में कोई जानकारी भविष्य में मेरे लिए उपलब्ध नहीं होगी। संदेश पूरी तरह आत्मनिर्भर है।
इसके लिए, मुझे पता है कि संदेश भेजने से पहले संदेश सामग्री हैश की तुलना करना चाहिए और संदेश भेजने से पहले हैश की तुलना करना चाहिए, और यदि संदेश अलग हो, तो वे अलग-अलग हैं, तो संदेश को छेड़छाड़ की गई है।
बेशक, यदि मैन-इन-द-बीच जानता है कि हैश वास्तव में संदेश सामग्री का हैश है, तो है, क्योंकि संदेश स्वयं निहित है, इसलिए वह केवल नई सामग्री बना सकता है और सामग्रियों के लिए एक ही हैश एल्गोरिदम लागू करें।
सवाल यह है कि हैश उत्पन्न करते समय संदेश सामग्री को यादृच्छिक बनाने के लिए मुझे कितनी लंबाई तय करनी चाहिए? यह कम रिटर्न के बिंदु तक कब पहुंचता है?
इस परिदृश्य में, मेरे पास कुंजी/मूल्य जोड़े का एक सेट है। इसके अंत में, मुझे जो कदम पता हैं उन्हें लेना है:
- संदेश में नमक जोड़ें। नमक दुनिया के बाकी हिस्सों के लिए एक रहस्य है। यह हैशिंग से पहले संदेश की सामग्री से जुड़ा हुआ है।
- हैश उत्पन्न करने से पहले एक महत्वपूर्ण तरीके से कुंजी/मूल्य जोड़े को ऑर्डर करें।
- जबकि सीधे प्रासंगिक नहीं है, तो रीप्ले हमलों को रोकने के लिए हैशिंग से पहले प्रत्येक संदेश की सामग्री में एक टाइमस्टैम्प जोड़ा जा रहा है।
- इससे पहले कि मैं उन्हें ऑर्डर कुंजियों को बदलने:
ये वैकल्पिक चरण हैं, जो मैं विचार कर रहा हूँ कर रहे हैं। मैंने उन्हें उलट दिया है, फिर गिनती/कुंजी द्वारा आदेश दिया गया है।
- अलग-अलग कुंजी/मूल्य जोड़े (कुंजी/मूल्य के लिए विभाजक और जोड़ी के लिए विभाजक दोनों के लिए अलग-अलग) के साथ बजाना।
नोट
संदेश गोपनीयता यहाँ नहीं एक आवश्यकता है, तो मैं एन्क्रिप्शन की तलाश नहीं कर रहा हूँ। मूल्य को सादे-पाठ में प्रेषित किया जाना चाहिए।
अंत में, मुझे क्या हैशिंग एल्गोरिदम से बचना चाहिए?
सुनिश्चित वर्णन
मैं जो मैं एक नियंत्रक जो इनपुट सत्यापन और दृढ़ता संभालती है एक ASP.NET MVC साइट है।
यदि (एक उदारवादी के आधार पर, यह महत्वपूर्ण नहीं है) इनपुट स्वचालित स्पैम प्रयास होने के लिए निर्धारित किया जाता है, तो IDictionary<string, string>
का मॉडल इनपुट मानों के साथ बनाया गया है और एक व्यूअरसेट को सामान्य कैप्चा पृष्ठ पर भेजा जाता है।
उस दृश्य में, कैप्चा नियंत्रण वाले रूप में, IDictionary<string, string>
की सामग्री छिपी हुई इनपुट फ़ील्ड में लिखी जाएगी, और फॉर्म की कार्रवाई वही क्रिया होगी जो मूल रूप से सामग्री को पोस्ट की गई थी। इस तरह, जब एमबीसी फॉर्म पुनः सबमिट किया जाता है तो मान ले सकते हैं।
इस वजह से मैं कुंजी/मूल्य जोड़े को एन्क्रिप्ट नहीं कर सकता (या शायद मैं कर सकता हूं और मुझे बता सकता हूं कि क्यों और कैसे!)।
बेशक, मुझे एक और मूल्य जोड़ने की आवश्यकता है, जिसमें हैश संदेश सामग्री शामिल है। यदि वह मान वहां है, तो नियंत्रक यह देखने के लिए जांच करेगा कि संदेश अखंडता बनाए रखा गया है, और इनपुट होने पर इनपुट को जारी रखने की अनुमति दें।
समाधान
मैं System.Security.Cyrptography.Pkcs नाम स्थान में SignedCms वर्ग है, जो signging और सीएमएस/PKCS # 7 संदेशों के सत्यापन का प्रतिनिधित्व करता है के साथ जाने का विकल्प चुना है।
विस्तार से बता दें मैं MAKECERT.EXE के साथ एक स्वयं जारी प्रमाणपत्र बना लिया है और उसके बाद मेरे कोड में, मैं यहाँ उदाहरण का उपयोग डिजिटल डेटा हस्ताक्षर करने के लिए: अब
http://blogs.msdn.com/shawnfa/archive/2006/02/27/539990.aspx
, यह होना चाहिए निर्यातित निजी कुंजी को सुरक्षित रखने के साथ-साथ सर्वर पर सुरक्षा रखने का मामला बनें, जो इसे प्रोग्रामिंग के बारे में कम बनाता है।
मुझे रीप्ले हमलों के लिए टाइमस्टैंप के लिए एक अतिरिक्त कुंजी जोड़नी होगी, लेकिन यह बहुत कठिन नहीं होगा।
उत्तर Kalium पर जाता है, न कि उनके initial post के लिए, लेकिन उनके अनुवर्ती टिप्पणियों के लिए जो डिजिटल हस्ताक्षरों के मार्ग की ओर इशारा करते हैं, और आखिरकार मेरी खोज .NET में उनका उपयोग कैसे किया जाता है।
योगदान देने वाले सभी लोगों के लिए धन्यवाद।
@ कालियम: नहीं, संदेश गोपनीयता कोई मुद्दा नहीं है और यह थोड़ा सा ओवरकिल है। वास्तव में, संदेश पारदर्शिता एक आवश्यकता है। – casperOne
यह संदेश अखंडता सुनिश्चित करने के लिए शायद सबसे अच्छा विकल्प है। आपको इसे एन्क्रिप्ट करने की आवश्यकता नहीं है, बस इसे साइन करें। आप इसके साथ सार्वजनिक कुंजी भी भेज सकते हैं। – Kalium
@ कालियम: इसके अंत में, क्या आपके पास .NET में अच्छे पीजीपी/जीपीजी संसाधनों के कोई लिंक हैं? इसके अलावा, "साझा रहस्य" मुद्दे के बारे में क्या? क्या तथ्य यह है कि आप एक असममित कुंजी के साथ हैश पर हस्ताक्षर करते हैं, निजी कुंजी को गुप्त बनाते हैं, और अलग-अलग डेटा को व्यवस्थित करने की आवश्यकता को अस्वीकार करते हैं? – casperOne