2017-03-16 18 views
0

こんにちは、私はデジタルSigning.Iに非常に新しいです。私は、デジタル署名されたXMLファイルを検証しており、私は次のコードを使用して検証しました。しかし、XMLが適切か改ざんされているかどうかを確認する方法を知りたい。いくつかの記事を調べた結果、 が見つかりました。1. XML用のハッシュを作成しました(署名部分は除外) 2.公開鍵を使用して署名を復号してください(ハッシュ値を取得します)。 3.両方のハッシュを比較します。 (両方のハッシュが一致すると、XMLは改ざんされません)。 私の理解は正しいですか?デジタル署名されたXMLファイルを確認するには?

これは私のXML

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
     <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> 
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
     <Reference URI=""> 
     <Transforms> 
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
     <DigestValue>u+1NVN5c3gbaxmIrkO9SzVQDklA=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue>QtQJjevrggzsFZj7PqD3p7GaWkzJAfyacjbMgMXgszCuO+Pxe2rrkScqvgGt2DJqgVlTbC/m9gnodCu7BcXSmW459mSJtyGH+ekWwj6g9ej8I7IYWCRqbI5uus3r3+vr/8ECd5CP/khu/LcCMyPuNIxA8h2EywCeQgbXBvLiWcdexBazdKQQpFxlKw0i+oTs8Ou6jViOdX1ZmTRtdKCQXzAElvpyNimQSmO9OECEs/TytjzIG98mpldfdofoq/2JC+xQhs6IF+Ctw/zlJdkgj1U18U/00Cw4puT4oScTELNSihSS+i9gAL+YjZLlIeunACbnZ4B1CVL/uS9kLlutXQ==</SignatureValue> 
    <KeyInfo> 
     <KeyValue> 
     <RSAKeyValue> 
      <Modulus>kHORMZQYOifL5UdIhKe54SfvJKyzLL5Aaw9MgpzeQPgBMmD9KMRnkeU+5RYMiUW8GT3q4eW77UihyxSX3MTAHzuqXoc6GjkBO1Tr41isud721SG7iMspw829YZKAHAPDAl0BV5gpLZagH8KXrDp4dVU+XDOOLZZZWZnbpKSFKvLaJO34KphZ/9W3L/l1BOwEs7132svmtwGgPO2Y16C90sDRWp78ZCYYhb7fAez7683+fijZCDGuVTvS0lBKhmH0ETiNfBAiELUUwHvQ5GHOFSp5PA8+hV9F7zxno1a0/OBpRsHfLydm3THyMUS7DlPE46zPiO9rRIUe90aQ64ulYQ==</Modulus> 
      <Exponent>AQAB</Exponent> 
     </RSAKeyValue> 
     </KeyValue> 
    </KeyInfo> 
    </Signature> 

そして、どのように私はXMLを検証していますの署名部分である:私は、XMLを変更し、VerifyXml方法を通してそれを確認した場合、それはfalseを返します。ここ

private void btnVerifySign_Click(object sender, EventArgs e) 
     { 
string LModulus = node.SelectSingleNode("//Signature/KeyInfo/KeyValue/RSAKeyValue/Modulus").InnerText.ToString(); 
       string LExponent = node.SelectSingleNode("//Signature/KeyInfo/KeyValue/RSAKeyValue/Exponent").InnerText.ToString(); 
using (var rsa = new RSACryptoServiceProvider()) 
       { 
var rsaParam = new RSAParameters() 
        { 
Modulus = Convert.FromBase64String(LModulus), 
         Exponent = Convert.FromBase64String(LExponent) 
        }; 
rsa.ImportParameters(rsaParam); 
bool result = VerifyXml(newxml1, rsa); 
} 

public static Boolean VerifyXml(XmlDocument Doc, RSA Key) 
     { 
      // Check arguments. 
      if (Doc == null) 
       throw new ArgumentException("Doc"); 
      if (Key == null) 
       throw new ArgumentException("Key"); 

      // Create a new SignedXml object and pass it 
      // the XML document class. 
      SignedXml signedXml = new SignedXml(Doc); 

      // Find the "Signature" node and create a new 
      // XmlNodeList object. 
      XmlNodeList nodeList = Doc.GetElementsByTagName("Signature"); 

      // Throw an exception if no signature was found. 
      if (nodeList.Count <= 0) 
      { 
       // throw new CryptographicException("Verification failed: No Signature was found in the document."); 
       MessageBox.Show("Verification failed: No Signature was found in the document."); 
      } 

      // This example only supports one signature for 
      // the entire XML document. Throw an exception 
      // if more than one signature was found. 
      if (nodeList.Count > 1) 
      { 
       MessageBox.Show("Verification failed: More that one signature was found for the document."); 
       // throw new CryptographicException("Verification failed: More that one signature was found for the document."); 
      } 

      // Load the first <signature> node. 
      signedXml.LoadXml((XmlElement)nodeList[0]); 

      // Check the signature and return the result. 
      return signedXml.CheckSignature(Key); 
     } 

とxml VerifyXmlメソッドを修正しないとtrueが返されます。 XMLの検証方法を知りたいですか?私はnodeList [0]の改ざんされていないXMLの値を比較しようとしましたが、同じ値を持っていますが、signedXml.CheckSignature(Key)はtrue/falseを返しています。ダイジェストの値はxmlの権利によって異なるはずですか?ここでは、変更されたXMLと変更されていないXMLのダイジェスト値が同じになっています。また、CheckSignature(Key)が真/偽を返す正確なものに基づいています。そして、xml?に対してハッシュ値が作成されたとき。ありがとうございました。

答えて

0

実際には、データオブジェクトではなく、署名された要素は<SignedInfo>です。データオブジェクトのハッシュは、<SignedInfo>要素の<Reference>要素に含まれています。したがって、データオブジェクトも間接的に署名されます。署名を検証するとき、データオブジェクトのハッシュ値は、<Reference>要素の署名されたデータダイジェストと比較されます。公開鍵を使用して<SignedInfo>要素の署名を確認します。

詳細については、RFC 3275を参照してください。ここでは、署名付きXMLの生成と検証の両方で実行されるステップに関する情報を見つけることができます。

+0

ただし、ここでは要素はnullです。どういう意味ですか?データオブジェクトのハッシュは生成されませんか? – Rakesh

+0

@Rakeshあなたの例では、 ''要素はnullではありません。それは ''、 ''、 ''要素を含んでいます。 ''は ''で定義されたアルゴリズムを使って生成されたデータオブジェクトのハッシュを含んでいます。 RFC3275の4.3.3節では、_Referenceは1回以上出現する要素であると言われています_。また、そのセクションに ''要素のコンテンツの説明があります。 – Nikemundo

関連する問題