2009-10-05 13 views
7

Jaki jest najlepszy sposób na mieszanie dokumentu XML w języku C#? Chciałbym zaimportować dokument XML, aby móc stwierdzić, czy został ręcznie zmieniony, od kiedy został wygenerowany. Nie używam tego dla bezpieczeństwa - to jest OK, jeśli ktoś zmienia kod XML i zmienia mieszankę, aby pasowała.Generowanie skrótu dokumentu XML w języku C#

Na przykład, ja hash węzły potomne korzenia i przechowywać hash jako atrybut korzenia:

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

W jaki sposób białe znaki wchodzą w grę w wybranym haszowaniu? –

+0

Jestem o tym przekonany - z jednej strony bardzo zależy mi tylko na danych, a nie na formatowaniu. Z drugiej strony, identyfikowanie * jakichkolwiek * zmian może być pomocne w sprawdzaniu, czy ktoś bawił się z plikiem. –

Odpowiedz

7

. NET ma classes, które implementują XML digital signature spec. Podpis może zostać dodany do oryginalnego dokumentu XML (tj. "Podpis kopertowy") lub zapisany/przesłany osobno.

To może być trochę przesada, ponieważ nie potrzebujesz zabezpieczenia, ale ma tę zaletę, że jest już wdrożony i jest standardem, który nie zależy od języka ani platformy.

+0

Podoba mi się to rozwiązanie, ponieważ, jak wskazałeś, jest ono już wdrożone i jest standardem. –

4

Można wykorzystać przestrzeń nazw kryptografii:

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

Wystarczy użyć klucza, aby utworzyć kryptograf mieszający, a następnie utworzyć skrót z ciągiem reqpresentation swojego xml.

+1

zobacz również System.Security.Cryptography.MD5, System.Security.Cryptography.SHA1, System.Security.Cryptography.SHA256, itp. I opisz porównanie tutaj: http://en.wikipedia.org/wiki/Cryptographic_hash_function –

+2

Kodowanie. Domyślnie kodowanie dla bieżącej strony kodowej ANSI systemu operacyjnego. Twój kod będzie zatem dawał różne wyniki w zależności od ustawień w opcjach regionalnych i językowych - Zaawansowane. –

+0

wcoenen ma bardzo dobry punkt. Użyj Encoding.ASCII lub Encoding. . –

2

Dodaj odwołanie .NET do System.Security i użyj XmlDsigC14NTransform. Oto przykład ...

/* 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; 
} 
Powiązane problemy