2009-10-05 2 views
7

में एक एक्सएमएल दस्तावेज़ हैश उत्पन्न करना सी # में एक्सएमएल दस्तावेज़ को हैश करने के बारे में सबसे अच्छा तरीका क्या है? मैं एक एक्सएमएल दस्तावेज हैश करना चाहता हूं ताकि मैं यह बता सकूं कि इसे उत्पन्न होने पर मैन्युअल रूप से बदला गया था या नहीं। मैं सुरक्षा के लिए इसका उपयोग नहीं कर रहा हूं - यह ठीक है अगर कोई एक्सएमएल बदलता है, और हैश को मिलान करने के लिए बदलता है।सी #

उदाहरण के लिए, मैं जड़ के बच्चे नोड्स हैश और जड़ की विशेषता के रूप हैश की दुकान चाहते हैं:

System.Security.Cryptography.MACTripleDES hash = new System.Security.Cryptography.MACTripleDES(Encoding.Default.GetBytes("mykey")); 
string hashString = Convert.ToBase64String(hash.ComputeHash(Encoding.Default.GetBytes(myXMLString))); 

:

<RootNode Hash="abc123"> 
    <!-- Content to hash here --> 
</RootNode> 
+0

व्हाइट्स स्पेस आपके वांछित हैशिंग में कैसे खेलता है? –

+0

मैं इसके बारे में बाड़ पर हूं - एक तरफ, मुझे केवल डेटा की परवाह है, प्रारूपण नहीं। दूसरी ओर, किसी भी * परिवर्तन की पहचान करना यह जांचने में सहायक हो सकता है कि कोई फ़ाइल के साथ खेल रहा था या नहीं। –

उत्तर

7

.NET में classes है जो XML digital signature spec को लागू करता है। हस्ताक्षर मूल XML दस्तावेज़ (यानी एक "लिफाफा हस्ताक्षर") के अंदर जोड़ा जा सकता है, या अलग से संग्रहीत/स्थानांतरित किया जा सकता है।

यह थोड़ी अधिक हो सकती है क्योंकि आपको सुरक्षा की आवश्यकता नहीं है, लेकिन इसका पहले से ही लागू होने का लाभ है, और एक मानक होने के नाते जो किसी भाषा या प्लेटफॉर्म पर निर्भर नहीं है।

+0

मुझे यह समाधान पसंद है, क्योंकि जैसा कि आपने बताया है, यह पहले ही लागू हो चुका है और यह एक मानक है। –

4

आप क्रिप्टोग्राफी नाम स्थान का उपयोग कर सकते हैं आपको केवल हैशिंग क्रिप्टोग्राफर बनाने के लिए एक कुंजी का उपयोग करने की आवश्यकता है और फिर अपने एक्सएमएल की स्ट्रिंग पुनर्मूल्यांकन के साथ हैश बनाएं।

+1

सिस्टम भी देखें। सुरक्षा। क्रिप्टोग्राफी.एमडी 5, सिस्टम.Security.Cryptography.SHA1, System.Security.Cryptography.SHA256, आदि और यहां तुलना की समीक्षा करें: http://en.wikipedia.org/wiki/Cryptographic_hash_function –

+2

एन्कोडिंग। ऑपरेटिंग सिस्टम के वर्तमान एएनएसआई कोड पेज के लिए डिफ़ॉल्ट एन्कोडिंग है। इसलिए आपका कोड क्षेत्रीय और भाषा विकल्प - उन्नत टैब में सेटिंग्स के आधार पर अलग-अलग परिणाम देगा। –

+0

wcoenen एक बहुत ही उचित बिंदु है। एन्कोडिंग.एएससीआईआई या एन्कोडिंग का प्रयोग करें। <कुछ संगत एन्कोडिंग>। –

2

सिस्टम.Security के लिए .NET संदर्भ जोड़ें, और XmlDsigC14NTransform का उपयोग करें। यहां एक उदाहरण दिया गया है ...

/* http://www.w3.org/TR/xml-c14n 

    Of course is cannot detect these are the same... 

     <color>black</color> vs. <color>rgb(0,0,0)</color> 

    ...because that's dependent on app logic's interpretation of XML data. 

    But otherwise it gets the following right... 
    •Normalization of whitespace in start and end tags 
    •Lexicographic ordering of namespace and attribute 
    •Empty element conversion to start-end tag pair 
    •Retain all whitespace between tags 

    And more. 
*/ 
public static string XmlHash(XmlDocument myDoc) 
{ 
    var t = new System.Security.Cryptography.Xml.XmlDsigC14NTransform(); 
    t.LoadInput(myDoc); 
    var s = (Stream)t.GetOutput(typeof(Stream)); 
    var sha1 = SHA1.Create(); 

    var hash = sha1.ComputeHash(s); 
    var base64String = Convert.ToBase64String(hash); 
    s.Close(); 
    return base64String; 
}