2009-10-05 12 views
7

C#でXMLドキュメントをハッシュするにはどうすればよいでしょうか?私はそれが生成された時から手動で変更されたかどうかを知ることができるように、XML文書をハッシュしたいと思います。私はセキュリティのためにこれを使用していません - 誰かがXMLを変更し、一致するようにハッシュを変更しても問題ありません。C#でXMLドキュメントハッシュを生成

例えば、私は根の子ノードをハッシュしたいとルートの属性としてハッシュを格納します。

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

私はそれについてのフェンスにあります - 一方では、私はデータを気にするだけで、フォーマットはしません。一方、* any *の変更を特定することは、誰かがファイルを使って遊んでいるかどうかを調べるのに役立ちます。 –

答えて

7

.NETにはXML digital signature specを実装するclassesがあります。署名は、元のXML文書の内部に追加することができ(すなわち、「エンベロープ署名」)、または別々に格納/転送することができる。

あなたはセキュリティが必要ないので少し難しいかもしれませんが、すでに実装されており、言語やプラットフォームに依存しない標準であるという利点があります。

+0

私はこのソリューションが気に入っています。あなたが指摘したように、すでに実装されており、標準であるからです。 –

4

あなたは暗号名前空間を使用することができますハッシュ暗号を作成するためにキーを使用し、xmlの文字列reqpresentationを使ってハッシュを作成するだけです。

+1

System.Security.Cryptography.MD5、System.Security.Cryptography.SHA1、System.Security.Cryptography.SHA256などを参照してください。ここで比較を確認してください:http://en.wikipedia.org/wiki/Cryptographic_hash_function –

+2

エンコーディング。デフォルトは、オペレーティングシステムの現在のANSIコードページのエンコーディングです。したがって、コードは、[地域と言語のオプション - 詳細設定]タブの設定に応じて異なる結果を表示します。 –

+0

wcoenenは非常に公正なポイントを持っています。 Encoding.ASCIIまたはエンコーディングを使用します。<整合性のあるエンコーディング>。 –

2

System.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; 
} 
関連する問題