XML署名(7)  XML署名の概要_2 XMLデータの正規化

2004年11月28日(日)更新


■同じ意味でもXMLデータの書き方が違うことがある

さらら: ねぇ。前回、たけちが言っていたXMLデータの正規化ってなに?

たけち: うん。前回はXML署名対象要素と署名要素の関係についてざっと見たね。そのときに署名の対象となるXMLデータは、そのまま使うんじゃなくって、XMLデータの正規化をしてから署名をするって言ったね。

さらら: えぇ、それってどういうことなのかしら?

たけち: さららは、XMLデータは同じ意味でも書き方が違う場合があるってことは知っているよね。

さらら: えっ、あっ。。。そっか。たとえば、空要素に二つの書き方があるようなこと?

たけち: そうそう。noteという名前の空要素は次のどちらの書き方でも良いよね。

<note></note>  または  <note  />

さらら: そうだったわね。

たけち: それから、次のようなXMLデータは、みんな同じ意味だよね。

(1)

<poet>柿本人麻呂</poet>

(2)

<poet   >柿本人麻呂</poet>

(3) <poet
>   柿本人麻呂</poet  >

■Canonical XML

さらら: 開始タグや終了タグ内の余分な空白や改行はあっても無くっても同じ意味だということね。でも、こういうことってよくあることなのかしら。

たけち: XMLデータを生成するアプリケーションを使ってなんらかのメッセージや、注文データを作るとするよね。そうしたとき、アプリケーションによっては、XMLデータの記述方法が異なる場合があるかもしれないね。

さらら: でも、意味が変わっているわけではないのよね。

たけち: そうだね。だから、XML署名の場合には、XMLデータを一定の決まった書き方に変更するんだ。これをXMLデータの正規化と呼んでいるんだよ。

たけち: XMLデータの正規化については、2001年3月にW3Cの勧告になった「Canonical XML Version 1.0」というのがあるんだよ。

さらら: Canonical XMLって、「正規のXML」っていう意味なのね。


■XMLデータの正規化の主な事がら

たけち: Canonical XMLでは、XMLデータをどのようにして正規化するのかを次に載せておくね。

さらら: はい。

  • 文字コードをUTF-8にする
  • XML宣言を取り去る
  • DTD宣言を取り去る
  • 空要素は開始タグと終了タグとで構成する
  • タグ内の空白を正規化する
  • 属性は、名前順に並び替える(xmlnsは先になります)
  • 指定されていない属性は、デフォルト値の記述を追加する
  • そのほか、いろいろと(改行コードを#xAにするなど)あります・・・

さらら: そっか。。。文字コードが違っても、意味は変わらないはずだわね。ところで、「空白を正規化する」ってなにをするの?

たけち: あっ、空白を正規化って、次のようなことをするんだよ。

  • 前後の空白文字を取り除く
  • 連続する空白文字を一つの空白文字に置きかえる

さらら: そうなの。

たけち: ここで、簡単な正規化の例を載せておくね。

XMLデータ
正規化前 <?xml version="1.0"?>
<manyo   >
   <poem  poet="額田王"
            no="0018"   >
   三輪山をしかも隠すか雲だにも心あらなも隠さふべしや
   </poem>
   <note   />
</manyo>
正規化後 <manyo>
   <poem no="0018" poet="額田王">
   三輪山をしかも隠すか雲だにも心あらなも隠さふべしや
   </poem>
   <note></note>
</manyo>

さらら: だいたいの雰囲気はわかったわ。

たけち: 「XMLデータの正規化」についてはこれくらいにして、次回からはXML署名の要素についてみていこうかな。

さらら: そうね。よろしくおねがいします。

→続きます。 (^ ^;


■(注) いくつかの正規化の例がCanonical XMLに載っていますのでご参照ください。