C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

質問:XMLファイルに対する電子署名値の算出方法


(過去ログ 84 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■49745 / inTopicNo.1)  質問:XMLファイルに対する電子署名値の算出方法
  
□投稿者/ Kazu (1回)-(2010/05/14(Fri) 21:24:48)

分類:[.NET 全般] 

以下のような署名付きXMLファイルを作成するために、SignedXmlクラスのComputeSignatureメソッドを使用しています。

開発環境:Visual Studio 2005 Professional
言語:VB2005,.netframework2.0

1個目のDigestValueノード値は、構成情報タグのsha1ハッシュ値です。
2個目のDigestValueノード値は、別ファイル(49500_01.xml)のsha1ハッシュ値です。
SignatureValueノード値は、SignedInfo値の電子署名値です。
この1個目のDigestValueノード値と、SignatureValueノード値が正確に算出できずに困っています。

<?xml version="1.0" encoding="UTF-8"?>
<DataRoot>
 <構成情報 ID="構成情報">
  <管理情報>
   <手続番号>
    <機関ID>1004</機関ID>
    <手続>4950000</手続>
   </手続番号>
  </管理情報>
 </構成情報>
 <署名情報>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="20100513115947">
   <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="#%E6%A7%8B%E6%88%90%E6%83%85%E5%A0%B1">
  <Transforms>
  <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
  </Transforms>
  <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
  <DigestValue>Xas26DM68fRhTverewa</DigestValue>
  </Reference>
  <Reference URI="49500_01.xml">
  <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
  <DigestValue>tiYs61aFCmcC5oAet/3szsG4zvA=</DigestValue>
  </Reference>
  </SignedInfo>
  <SignatureValue>Xx+7iXHGEqqEK9z8DPzCglwrTXKN0pRgSmYwahS5vbmJHx1xTFI9XTw/esb87I61G5WewWkSqA7A</SignatureValue>
  <KeyInfo>
  <X509Data>
  <X509Certificate>MIIEBzCCAu+gAwIBAgIERrBOdjANBgkqhkiG9w0BAQUFADAuMQswCQYDVQQGEwJKUDERMA8GA</X509Certificate>
  </X509Data>
 </KeyInfo>
 </Signature>
 </署名情報>
</DataRoot>

上記のDigestValue、SignatureValueの算出にあたって以下のような2パターンの実装を試みました。
しかし、どちらも不完全ですので、アドバイスがあればお願い致します。

1.外部別ファイルへのDetached(外包)
 以下のようなSignedXmlオブジェクトを設定しました。
 1個目のReferenceの設定されている値(\eg.xml)は、構成情報ノードをエクスポートしたファイルです。
 この状態で、ComputeSignatureメソッドを実行すると、DigestValue値は正確に求められましたが、
 SignatureValue値は、正確に求められませんでした。
 SignatureValue値が正確でない原因は、URI値が算出すべき値だからだと認識しています。

 ここで質問なのですが、SignedInfoノード内のハッシュ値が正しく計算済みという前提で、
 DigestValueの計算は行わず、SignedInfoノードをもとに、
 SignatureValue値のみを算出する方法はありますでしょうか?

<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="C:\eg.xml">
   <Transforms>
    <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
   </Transforms>
   <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
   <DigestValue>XasM68vUzGSDRWi0p8Eg=</DigestValue>
  </Reference>
  <Reference URI="C:\495000005583005603_01.xml">
   <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
   <DigestValue>tiYs61mcC5o</DigestValue>
  </Reference>
 </SignedInfo>
 <SignatureValue>JUcFmew7mLi3U45B4kzZKM</SignatureValue>
</Signature>

※eg.xml
<構成情報 ID="構成情報">
 <管理情報>
  <手続番号>
   <機関ID>1004</機関ID>
   <手続>4950000</手続>
  </手続番号>
 </管理情報>
</構成情報>

2.同一ファイル内XML 要素へのEnveloping(内包)
 以下のようなSignedXmlオブジェクトを設定しました。
 1個目のReferenceの設定されている値は、ハッシュ算出対象を参照するためのID値です。
 この状態で、ComputeSignatureメソッドを実行すると、1個目のDigestValue値は不正確(Javaによる検証)で、
 2個目のDigestValue値は正確でした。DigestValueが不正確なので、SignatureValue値も不正確でした。
 改善すべき部分はあるでしょうか?
 (1個目のDigestValue値さえ正確に算出できるようにSignedXmlオブジェクトを設定すれば、SignatureValueも
  正確に算出できると考えています。)

<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="#%E6%A7%8B%E6%88%90%E6%83%85%E5%A0%B1">
   <Transforms>
    <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
   </Transforms>
   <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
   <DigestValue>WRFhGHaaa</DigestValue>
  </Reference>
  <Reference URI="49500_01.xml">
   <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
   <DigestValue>tiYs61mcC5o</DigestValue>
  </Reference>
 </SignedInfo>
 <SignatureValue>XBOqdoYcg/5zwe24OosdYkV1Ei0IuewXq4wn4oc3P4rg</SignatureValue>
 <Object Id="%E6%A7%8B%E6%88%90%E6%83%85%E5%A0%B1">
  <構成情報 ID="構成情報" xmlns="">
   <手続番号>
    <機関ID>1004</機関ID>
    <手続>4950000</手続>
   </手続番号>
  </管理情報>
 </Object>
</Signature>
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -