■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>
|
|