Canonicalize XML in Java

はじめに

XML 署名の前に正規化 canonicalization を押さえておくべきだったな、とちょっと反省。

日頃使う html あたりを思い浮かべてもらえればピンとくると思うのだが、同じ内容を表現するのに元のコードは表記上はブレがある。
例えば、<tag> を <tag > と書こうが、ブラウザのパーサーは同じものと解釈する。
しかし、XML のデータ(構造)を丸ごと暗号化するような場合、これでは困る。
異なる数値データになってしまうからだ。
そこで、暗号化する前に何らかの仕方で表記のブレを統一しておきましょうという話になる。
これを正規化 canonicalization と呼んでいて、いくつかの方法が提案されている。

なお、よく C14N という表記が見られるが、これは anonicalizatio が14文字であることに起因する。

公開鍵基盤あたりの普及で電子データの長期保存のニーズは高まるだろうから、今後、この分野の知見は重要分野になってくるのは間違いない。

・・・とは思うのですが、この分野、ネット上の情報の質がちょっと・・・・。

例えば、この記事と同タイトルの英文記事があるのだが、そのサンプルがね。

普通に動かない(笑)。

説明はわかりやすいんすよ。

From the output, we can see that the Root node is removed in the canonicalized data, this is because the NodeFilter in NodeSetDataImpl has filtered this node. Next, the second my:Node has the xmlns:my node before Id node in the canonicalized form. This is based on the Canonical XML specification where the nodes should be in lexical order

出力から、正規化されたデータでルート ノードが削除されていることがわかります。これは、NodeSetDataImpl の NodeFilter がこのノードをフィルター処理したためです。次に、2 番目の my:Node には、正規化された形式で Id ノードの前に xmlns:my ノードがあります。これは、ノードが字句順に配置される必要がある Canonical XML 仕様に基づいています。

ここまで明快に具体的な正規化の方法を言及した記事はほとんどないっすから。
しかし、なんで(おそらくこの人の環境でしか動かない) tool なんてメソッドがソースに混入してるんだ???

車輪の再整備

よくわからない tool は、機能を読み取って変更。

オクテットストリームも InputStream でキャスト。

・・・

諸々する。

(ソースコード公開は少々お待ちを)

正規化例

修正して動かすと例えば、こんな結果が得られる。

何がどう変わったか?

<info/> → <info></info> あたりはわかりやすいでしょう。

よく見ると属性も変化してます。

要チェック。

その他

電子処方箋でも XML の正規化は必要になってきます。
このスレなど参照。

(続く)

クリックclose

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です