鍵の名前、鍵の値、X.509証明書などの記述が鍵情報内に含まれる。●XML暗号の特徴XML暗号はW3C*3で最終的な勧告としてまとめられているものである。XML暗号はXML署名と同様にASN.1のファイルベースの暗号化に比べて柔軟な利用が可能である。XML暗号の暗号化対象は任意のデータ(非XMLも含む)の暗号化ばかりではなく、任意のXMLの要素やコンテントの暗号化も可能である。ファイルベースの暗号化の場合には、復号を行わなければ内容に何が書かれているか分からないが、XMLの要素レベルの暗号化によって文書の中の本当に秘匿すべき部分のみを暗号化することが可能で、そのほかの部分は可読性を維持できる。これは例えば、注文書などで本当にプライバシーの保護が必要なクレジット番号の入力要素部分のみを秘匿するなどの利用が可能になる。XML暗号は、XML署名と同様に以下の特徴がある。暗号対象、暗号アルゴリズムや署名値および証明書などをXMLの文法で統一して表現できる。暗号構文がXMLタグ付きであり、ASN.1構文に比べて分かりやすい。任意のデータファイルやXML文書の全体だけではなく、XML文書の一部に対しての暗号化もでき、多様な形式の暗号文書の作成に柔軟に対応できる。Identifier)を指定するのに対して、W3Cなどで定めているURIを参照する。http://www.w3.org/Encryption/2001/●XML暗号の構文XML暗号の構文は図4に示すようにEncryptedDataで指定される。EncryptionMethodは暗号方式を指定するもので、3DES-CBCやAES128-CBCなどの共通鍵アルゴリズムを指定する。ds:KeyInfoはXML署名で定めた鍵情報を指定するもので、子要素にEncryptedKeyで共通鍵を公開鍵で暗号化した鍵データを指定する。鍵の名称(鍵の所有者名)を指定する。CipherData要素では共通鍵で暗号化したデータをCipherValue要素にbase64でエンコードした値が置かれる。XML暗号構文ここで示したXML暗号構文は要点を示したもので、実際は鍵情報の内容や暗号データなどを間接参照させる方法もある。●XML暗号の処理方法ここではオリジナルのXML文書がどのように暗号化されるかを見てみよう。図5にクレジットカードを使った支払いデータのXML文書を示す。黄色の部分がCreditCard要素である。暗号化したい部分はクレジットカードのデータで、CreditCard要素全体をXML暗号化プロセッサで暗号化した結果は図6のようになる。ここではCreditCard要素がEncryptedData要素に置き換えられ、暗号化されたデータがCipherData要素のCipherValueにBase64でエンコードされることになる。この例はCreditCard要素全体を暗号化したものだが、クレジットカードの番号(コンテント)のみを暗号化することもできる。XML暗号化の例この例では暗号化鍵の情報<KeyInfo>を含めていないので、文書を暗号化するための共通鍵のアルゴリズムや鍵の値はあらかじめ知っていることとしている。PKIの環境で宛先、山田太郎の公開鍵を使って文書の暗号化のための共通鍵を暗号化してXML暗号文に添付する場合は、図7のようにEncryptedData要素の子要素に文書暗号化のための共通鍵のアルゴリズム<EncriptionMethod>の指定と、<KeyInfo>に宛先の公開鍵情報を指定することになる。●暗号化処理と復号処理ここでは以下の用語を用いることにする。Application:XML暗号化(復号)要求を行うアプリケーションEncryptor:XML暗号化処理を行うモジュールDecryptor:XML暗号化処理されたXMLデータを復号するモジュール●暗号化EncryptedDataまたはEncryptedKey要素を構成するためにEncryptorは以下の処理を行う。要素の子要素としてEncryptedKey要素を適切に構成するデータを暗号化する暗号化対象の要素(エレメント)または内容(コンテント)を直列化(シリアライズ)し、オクテッド列を得て、選択したアルゴリズムと取得した鍵でこのオクテッドを暗号化するEncryptedType(EncryptedDataまたはEncryptedKey)構文を構成する暗号化されたデータはCypherData要素のCypherValue要素にbase64でエンコードして格納する。暗号化対象がエレメントまたはコンテントの場合、EncryptorはEncryptedData要素をApplicationに返し、Applicationがこれを新しいXML文書のトップレベルとして使うか、ほかのXML文書に挿入できるようにするApplicationがエレメントまたはコンテントを指定して暗号化を要求する場合には、Encryptorは指定されたエレメントまたはコンテントを削除しEncryptedData要素で置換する暗号化対象がエレメントまたはコンテントでない場合、EncryptorはEncryptedData要素をApplicationに返し、Applicationがこれを新しいXML文書のトップレベルとして使うか、ほかのXML文書に挿入できるようにする●復号EncryptedDataまたはEncryptedKey要素の暗号化されたデータを復号するためにDecryptorは以下の処理を行う。EncryptedDataまたはEncryptedKey要素を処理し、アルゴリズムをKeyInfoの鍵情報から得るds:KeyInfoからデータ暗号化鍵を得る。データ暗号化鍵が暗号化されていた場合、対応する鍵を復号して得るCypherData要素のCypherValueにあるテキストをbase64でデコードし、暗号データを得てデータ暗号化鍵で復号する。復号したエレメントまたはコンテントを処理するDecryptorは復号したType(エレメントまたはコンテント)の値をApplicatioに返すか、もしApplicationから指定されたらEncryptedData要素を復号したエレメントまたはコンテントで置換する。復号したデータをApplicationに返し、Applicationが整形処理を行う。●アルゴリズムW3CのXML暗号の仕様には以下のようなアルゴリズムが必須として指定されている。Wrapメッセージ・ダイジェスト(ハッシュ関数)SHA-1、SHA256、SHA512●公開鍵の有効性検証W3CのXML暗号仕様にはデータ暗号化鍵を配布するために用いる公開鍵については、これが正しい公開鍵であることを前提にしている。従ってXML暗号の利用者は、この公開鍵があて先の正しい公開鍵であることを事前に調べておかなければならない。公開鍵証明書の有効性検証を別途行っておく必要がある。このような検証はXML暗号処理を行うアプリケーション自身で行うか次回に述べるXKMSなどに処理させることが必要である。●XML署名、XML暗号の処理ツールオリジナルのXML文書を処理してXML署名やXML暗号を生成するためには、JavaプログラムのアプリケーションなどでXML署名、XML暗号を生成できるツールキットが必要である。このようなツールキットはIBMやEntrustなどが提供している。なく、PKIの環境と連動させた署名検証や暗号の復号を行う機能も含まれている。今回はWebサービス・セキュリティの基本となるXMLデジタル署名とXML暗号について述べた。次回はWebサービスのメッセージングに必須なSOAPとXMLセキュリティで鍵管理を外部サーバに任せるXKMSについて解説することにする。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。