2009-04-02 18 views
6

मेरे पास एक संदेश है कि मैं अपने आप को पास कर रहा हूं जो कि मध्य-मध्य-मध्य हमलों के अधीन होगा। इसके कारण, मैं उस संदेश के अखंडता के बारे में चिंतित हूं जब मैं इसे भेजता हूं, और जिस समय मैं इसे वापस प्राप्त करता हूं।संदेश अखंडता को बनाए रखना

यह माना जाना चाहिए कि एक बार जब मैं स्वयं को संदेश भेजता हूं, तो भेजे गए संदेश के बारे में कोई जानकारी भविष्य में मेरे लिए उपलब्ध नहीं होगी। संदेश पूरी तरह आत्मनिर्भर है।

इसके लिए, मुझे पता है कि संदेश भेजने से पहले संदेश सामग्री हैश की तुलना करना चाहिए और संदेश भेजने से पहले हैश की तुलना करना चाहिए, और यदि संदेश अलग हो, तो वे अलग-अलग हैं, तो संदेश को छेड़छाड़ की गई है।

बेशक, यदि मैन-इन-द-बीच जानता है कि हैश वास्तव में संदेश सामग्री का हैश है, तो है, क्योंकि संदेश स्वयं निहित है, इसलिए वह केवल नई सामग्री बना सकता है और सामग्रियों के लिए एक ही हैश एल्गोरिदम लागू करें।

सवाल यह है कि हैश उत्पन्न करते समय संदेश सामग्री को यादृच्छिक बनाने के लिए मुझे कितनी लंबाई तय करनी चाहिए? यह कम रिटर्न के बिंदु तक कब पहुंचता है?

इस परिदृश्य में, मेरे पास कुंजी/मूल्य जोड़े का एक सेट है। इसके अंत में, मुझे जो कदम पता हैं उन्हें लेना है:

  1. संदेश में नमक जोड़ें। नमक दुनिया के बाकी हिस्सों के लिए एक रहस्य है। यह हैशिंग से पहले संदेश की सामग्री से जुड़ा हुआ है।
  2. हैश उत्पन्न करने से पहले एक महत्वपूर्ण तरीके से कुंजी/मूल्य जोड़े को ऑर्डर करें।
  3. जबकि सीधे प्रासंगिक नहीं है, तो रीप्ले हमलों को रोकने के लिए हैशिंग से पहले प्रत्येक संदेश की सामग्री में एक टाइमस्टैम्प जोड़ा जा रहा है।

    1. इससे पहले कि मैं उन्हें ऑर्डर कुंजियों को बदलने:

    ये वैकल्पिक चरण हैं, जो मैं विचार कर रहा हूँ कर रहे हैं। मैंने उन्हें उलट दिया है, फिर गिनती/कुंजी द्वारा आदेश दिया गया है।

  4. अलग-अलग कुंजी/मूल्य जोड़े (कुंजी/मूल्य के लिए विभाजक और जोड़ी के लिए विभाजक दोनों के लिए अलग-अलग) के साथ बजाना।

नोट

संदेश गोपनीयता यहाँ नहीं एक आवश्यकता है, तो मैं एन्क्रिप्शन की तलाश नहीं कर रहा हूँ। मूल्य को सादे-पाठ में प्रेषित किया जाना चाहिए।

अंत में, मुझे क्या हैशिंग एल्गोरिदम से बचना चाहिए?


सुनिश्चित वर्णन

मैं जो मैं एक नियंत्रक जो इनपुट सत्यापन और दृढ़ता संभालती है एक 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 में उनका उपयोग कैसे किया जाता है।

योगदान देने वाले सभी लोगों के लिए धन्यवाद।

उत्तर

6

मुझे लगता है कि पीजीपी/जीपीजी वह है जो आप यहां चाहते हैं।

+0

@ कालियम: नहीं, संदेश गोपनीयता कोई मुद्दा नहीं है और यह थोड़ा सा ओवरकिल है। वास्तव में, संदेश पारदर्शिता एक आवश्यकता है। – casperOne

+1

यह संदेश अखंडता सुनिश्चित करने के लिए शायद सबसे अच्छा विकल्प है। आपको इसे एन्क्रिप्ट करने की आवश्यकता नहीं है, बस इसे साइन करें। आप इसके साथ सार्वजनिक कुंजी भी भेज सकते हैं। – Kalium

+0

@ कालियम: इसके अंत में, क्या आपके पास .NET में अच्छे पीजीपी/जीपीजी संसाधनों के कोई लिंक हैं? इसके अलावा, "साझा रहस्य" मुद्दे के बारे में क्या? क्या तथ्य यह है कि आप एक असममित कुंजी के साथ हैश पर हस्ताक्षर करते हैं, निजी कुंजी को गुप्त बनाते हैं, और अलग-अलग डेटा को व्यवस्थित करने की आवश्यकता को अस्वीकार करते हैं? – casperOne

1

आप Digitally Signed message चाहते हैं। जीपीजी का उपयोग करके आप संदेश पर एन्क्रिप्ट कर सकते हैं। लेकिन कोई भी इसके साथ छेड़छाड़ नहीं कर पाएगा, क्योंकि वे हैश - उत्पन्न नहीं कर सकते हैं केवल इसलिए कि हैश आपकी निजी कुंजी का उपयोग कर सकता है।

0

आपको शायद संदेश पर डिजिटल हस्ताक्षर करना चाहिए (इसलिए कलियम द्वारा अनुशंसित पीजीपी/जीपीजी एक विकल्प के रूप में प्रासंगिक है)। कोई भी शुद्ध हैश जिसे आप बना सकते हैं हमलावर द्वारा पुनर्निर्मित किया जा सकता है। डिजिटल हस्ताक्षर - अपनी निजी हस्ताक्षर कुंजी का उपयोग करके ताकि आपकी सार्वजनिक कुंजी का उपयोग इसे सत्यापित करने के लिए किया जा सके - समाधान है। कुछ भी व्यर्थता में एक अभ्यास है।

0

यह मानते हुए कि आप एक "सुरक्षित" चैनल (अर्थात हैश) पर कोई भी जानकारी अग्रेषित नहीं कर सकते यहाँ आप इसे कैसे करना होगा है:

  1. हैश संदेश है, तो एक निजी कुंजी के साथ हैश करें। संदेश में हस्ताक्षरित हैश शामिल करें।
  2. जब आपको संदेश मिलता है, तो हस्ताक्षर किए गए हैश को डिक्रिप्ट करने के लिए सार्वजनिक कुंजी का उपयोग करें और सत्यापित करें कि यह संदेश के वास्तविक हैश से मेल खाता है।

एक हमलावर एक संदेश "नकली" करने में सक्षम नहीं होगा, क्योंकि उन्हें अपने नए हैश को एन्क्रिप्ट करने के लिए अपनी निजी कुंजी की आवश्यकता होगी।

दूसरों के रूप में उल्लेख किया है, यह सिर्फ सादे वेनिला डिजिटल हस्ताक्षर सबसे सीधे आगे दृष्टिकोण आपके आवेदन की पुष्टि है कि अपने स्वयं के संदेशों के साथ छेड़छाड़ नहीं की गई है अनुमति देने के लिए है और पीजीपी की तरह कुछ के द्वारा नियंत्रित किया जा सकता है/GPG

2

एक कुंजी हैश संदेश प्रमाणीकरण कोड का उपयोग करना होगा। संदेश स्पष्ट रूप से भेजा गया है, लेकिन इसमें छेड़छाड़ को रोकने के लिए हैश भी शामिल है। हैश संदेश सामग्री और एक गुप्त कुंजी दोनों पर निर्भर करता है। मध्य में आदमी कुंजी को जानने के बिना एक बदले संदेश पर हैश नहीं बना सकता है। चूंकि आपका एप्लिकेशन दोनों संदेशों को बनाता और सत्यापित करता है, इसलिए इसे गुप्त कुंजी का खुलासा करने की आवश्यकता नहीं होती है।

मैं विशेष रूप से आरएफसी-2104 http://www.ietf.org/rfc/rfc2104.txt में वर्णित कार्यान्वयन की सिफारिश करता हूं क्योंकि इसे संभावित रूप से संभावित नुकसान से बचने के लिए सावधानी से सोचा गया है।

यदि संदेशों को अविश्वसनीय पार्टियों द्वारा प्रामाणिकता के लिए भी सत्यापित किया जाना चाहिए, तो आपको इसके बजाय डिजिटल हस्ताक्षर योजना का उपयोग करना चाहिए।

नेट पुस्तकालयों में दोनों के लिए कुछ समर्थन की संभावना है। माइल्स ने एसएचए 1 हैश: http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.aspx का उपयोग करके एक कुंजीपटल एचएमएसी को लागू करने वाले .Net लाइब्रेरी फ़ंक्शंस के लिए एमएसडीएन वेब पेज के लिए एमएसडीएन वेब पेज का एक लिंक मददगार रूप से प्रदान किया।

+0

+1 एचएमएसी। अधिकांश अन्य उत्तरों द्वारा सुझाए गए असममित डिजिटल हस्ताक्षर इस समस्या के लिए अधिक हैं। – Miles

+0

http://en.wikipedia.org/wiki/HMAC - http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.aspx – Miles

संबंधित मुद्दे