2.2.4 データの直列化および復元処理
XML Security - Coreでは,XMLデータの要素またはコンテンツを暗号化する場合,暗号化の対象となる部分を直列化してUTF-8文字列として出力してから,暗号化を実施します。そのため,暗号化されたXMLデータの要素またはコンテンツを復号化する場合,復号化結果として出力されるUTF-8文字列のデータをXMLデータに復元する必要があります。
この節では,XML Security - CoreのXML暗号機能によるデータの直列化および復元処理について説明します。なお,説明の中に出てくるAPIの仕様については,次のフォルダに格納されているAPIリファレンスを参照してください。
(1) 直列化処理
XMLデータの要素またはコンテンツを暗号化する場合,XMLEncryptionクラスのencryptXMLメソッドを使用します。encryptXMLメソッドは,DOMサブツリーを直列化したあと,暗号化を実行します。encryptXMLメソッドは,次の規則に従ってXMLデータを直列化します。
-
直列化した結果は,UTF-8で出力する。
-
DOMサブツリー内のノードは,文書順に出力する。
-
DOMサブツリー内のノードは,省略しないですべて出力する。例えば,デフォルト属性が指定されている場合は,デフォルト属性も出力する。
-
DOMサブツリー内のノードに対して,ノード外からの情報は導入しない。例えば,C14Nのように,名前空間宣言を祖先から導入しない。
-
子ノードを持たない要素ノードも含めて,すべての要素ノードの開始タグおよび終了タグを出力する。例えば,元のXML文書で<foo/>と記述されている要素は,<foo></foo>として出力する。
-
要素内の属性または名前空間宣言の出力順序は不定。
直列化を実行する場合に名前空間宣言を生成したり,名前空間宣言を祖先ノードから導入したりする必要があるときは,独自の直列化処理を実装してください。その場合は,独自に直列化した結果のオクテット列をencryptメソッドで暗号化する必要があります。
(2) 復元処理
暗号化されたXMLデータの要素またはコンテンツを復号化する場合,XMLEncryptionクラスのdecryptXMLメソッドを使用します。decryptXMLメソッドは,XMLデータを復号化したあと,復号化結果からDOMサブツリーを復元します。decryptXMLメソッドは,次の規則に従ってDOMサブツリーを復元します。
-
復号化の結果をUTF-8で表現されたXMLデータとして,復元処理を実行する。
-
要素または要素コンテントとしてwell-formedなXMLデータに対して,復元処理を実行する。
-
EncryptedDataと置き換えた場合に,すべての名前空間が宣言されているXMLデータだけに対して復元処理を実行する。
- 注意事項
-
XML Security - Coreでは,エンティティ参照を含むXMLデータに対しては復元処理を実行できません。ただし,定義済みのエンティティ(amp,lt,gt,apos,quot)を含むXMLデータに対しては,復元処理を実行できます。
暗号化のときとは異なる名前空間コンテキストで復号化する場合などは,独自の復元処理を実装してください。その場合は,decryptメソッドで復号した結果を独自に復元する必要があります。