XML暗号化の基礎と実践
後編 XML暗号化と電子署名の実践
前編の「XML暗号化と正規化と電子署名」では、XMLを利用するうえで必要なセキュリティと、それを支える仕様などをいくつか紹介した。SSLの利用、エレメント暗号、電子署名と正規化、XACML、XKMSといったものがそれぞれどのような役割を果たすのか、お分かりいただけただろう。今回は、これらの技術のいくつかを実際に利用できるように作られたツール「IBM XML Security Suite for Java(XSS4J)」を使って、実際にXMLのセキュリティ技術を体験してみよう。
米持幸寿 ・木下直樹日本アイ・ビー・エム
2002/9/19
4. XMLセキュリティ・スイートを使う |
■IBM alphaWorks
IBMは、研究中または開発中のソフトウェアを、試用を目的に無償でダウンロードできるWebサイト「alphaWorks(アルファ・ワークス)」を開設している。ここではIBMが開発中の多くのXML関連ソフトウェアも公開されており、今回紹介するXSS4Jもアルファ・ワークスでダウンロードできる。
アルファ・ワークスで配布されているソフトウェアは、基本的には90日間無償で試すことができる。試用版という位置付けだが、一部のソフトウェアはライセンスを購入すれば業務に利用したり、市販ソフトウェアに含めたりすることができる。
今回は、XMLエレメント暗号、実システムで実用化されているXML電子署名などを紹介する。
■暗号や電子署名のライブラリを提供するXSS4J
アルファ・ワークスの画面 XSS4Jは、アルファ・ワークスの「XML Security Suite」のページのダウンロードボタン(赤で囲ったところ)をクリックして、ダウンロードする |
まずは、XSS4Jを紹介しよう。XSS4Jでは、以下の機能を提供するライブラリが含まれており、Javaアプリケーションから簡単に呼び出して使うことができる。
- XMLエレメント暗号
- XMLアクセス制御
- ASN.1/XML変換
- XML電子署名
- DOMHASH計算
- XML正規化
XSS4Jに含まれているそれぞれのライブラリは、作ったエンジニアも、作られたタイミングも違うため、必要とするライブラリやバージョンが少しずつ違う点に注意が必要だ。例えば、XMLエレメント暗号ライブラリは、XMLパーサとしてXerces 2.xを必要とするが、XML電子署名ライブラリはXerces 1.xを必要とする。この場合、Xerces 1.xはJava 1.x用で、Xerces 2.xはJava 2.x用なので、XMLエレメント暗号とXML電子署名を同じJava VM上で行うことは困難である。
XSS4J全体に共通していえることは、各ライブラリが要求する「前提ソフトウェア」は、厳密に正しいバージョンを要求する、ということである。バージョンが新しければいいだろうと思うと、なくなったクラスがあったりしてうまく動かない。このへんは、オブジェクト指向ライブラリのバージョン管理の難しさを露呈しているともいえる。JCPのありがたさを実感する。
前提になる各パッケージを入手するには、XSS4Jのドキュメントにリンクがあるので、それを利用しよう。ダウンロードするときは、最新版をダウンロードするのではなく、要求されているバージョンをダウンロードすること。最新版ではクラス名やパッケージ名が変更になっていて動作しないものがある。
XSS4Jには、2001年1月29日版、2001年10月29日版、2002年4月22日版がある。それぞれのバージョン間で、XSS4Jのライブラリ中に名前が変更になったクラスがあるので(SignatureGenerator→TemplateGenerator、DigestMethod→XSignatureなど)、以前のバージョンで作ったアプリケーションが新しいバージョンで動かなくなることがある。これも注意したい。こうした点も、いかにもアルファ・ワークスで公開されているコードらしい。この記事では2002年4月22日にポストされたパッケージを利用して解説する。ダウンロードは、アルファ・ワークスの「XML Security Suite」のページから行う。
XSS4Jには特別なインストーラはない。完全なJavaライブラリであり、ZIPファイルで配布されている。今回は動作確認にWindowsを使っているが、LinuxやOS/390のような、ほかのプラットフォームでも、ZIPファイルを適当なディレクトリに展開し、必要なJARファイルにクラスパスを通せば動く。
■XMLエレメント暗号
ではまず、XML文書の暗号化機能を試してみよう。「XML Encryption Implementation」という名前の機能である。これは、XML文書の部分的な暗号化であるXMLエレメント暗号を実現する(XMLエレメント暗号については前編参照)。この機能を利用するための前提パッケージは以下のものである。
- JDK 1.3以上
- Java Cryptography Extension (JCE) 1.2.1
- Xerces2 Java Parser 2.0とサンプル
- Xalan-Java 2.3
- International Components for Unicode for Java 2.0(ICU4J)
それぞれの入手方法について説明しておこう。JDKは、サン・マイクロシステムズのJava.Sun.Comサイトの「Downloads」ページから取得できる。J2SE 1.3.1 Japanese Editionあたりを選択すればよいだろう。JCE 1.2.1も、Java.Sun.Comサイトの「Java(TM) Cryptography Extension (JCE) 1.2.2」のページの下の方にある「Downloads」のリンクから取得できる。
Xerces2は、The Apache Software FoundationのXerces 2 Java Parser Readmeの左側にある「Download」メニューから取得でき、Xalanは同じサイトの「Xalan-Java version」 ページの下の方にある「Where do I get Xerces?」の欄のリンクからたどるといいだろう。ICU4Jは、IBMの「International Components for Unicode for Java」で公開されている。左側にある「download」のリンクをクリックすると取得できる。
ちなみに、IBMが提供するJDKにはJCEが含まれているので、筆者はIBMのJDKのJCEパッケージをそのまま使っている。ICU4Jは、ドキュメントには2.1が前提と書いてあるが、実際にはICU4J 2.0と組み合わせないと動作しない。
■カード番号を暗号化する
それぞれをインストールしたら、実際にXMLエレメント暗号を試してみよう。データは「XSS4Jパス\data\enc」以下のものを使い、サンプル・プログラムである「enc.DOMCipher」を使って暗号化してみる。まずは、準備されているデータを見よう。
<?xml version="1.0" encoding="UTF-8"?> |
リスト1 Bookorder.xml |
ご覧いただいて分かるように、これは書籍の注文データである。注文データは大きく分けて、書籍の情報、支払い情報、カード情報に分かれている。その内容を見ると、100ドルの「XML and Java」という本を1冊購入し、「A Card Company」で1999年10月10日までに100ドルを払う、カード名義は「Your Name」、カード期限は2001年4月、番号は……、という情報である。
この「cardinfo」の部分を暗号化してみる。つまり、発注書を受け取った店ではクレジット・カード番号を読めないようにするのが目的である(一方で、この発注書はクレジット・カード会社にも転送される。クレジット・カード会社には暗号化されたクレジットカード番号を読めるようにする)。
XML文書を暗号化するには、サンプル・プログラム「DOMCipher」を使う。暗号化には、暗号用の「キー」の情報を渡す必要があるため、ここでは、キーの情報が入った以下のファイルを使う。
<?xml version="1.0"
encoding="UTF-8" ?> |
リスト2 keyinfo1.xml 暗号化のためのキー情報が入っている |
実行にはenc.DOMCipherを呼び出すわけだが、JARファイルがかなりたくさんあるので、ライブラリ拡張機能を使った方が簡単である。以下のバッチファイルを参考にしてほしい。パスの順番は重要で、特にXercesのJARファイルがパスの先頭に来るようにした方がよい。バッチファイルの中の「Keytool」コマンドと、最後の「java」コマンド以降はそれぞれ1行であるので、気を付けていただきたい。
set xss4j_home=D:\_work\xss4j↓ |
リスト3 enc.bat(改行個所には↓ マークを付加した) |
暗号化されたXML文書は標準出力へ出力される。上記のバッチファイルでは、リダイレクトされてresult.xmlファイルに出力されている。result.xmlには、次のようなXML文書が格納されている。
<?xml version="1.0" encoding="UTF-8"?> |
リスト4 result.xml (リストを見やすいように、適宜改行を入れてある) |
青く色を変えている部分が暗号化された部分である。Keyinfo以下にキー情報が、CipherData以下に暗号化されたデータが保存されている。
DOMCipherのソースコードは「samples/enc」の下にあるので、参考にしてほしい。
4/6 |
Index | |
XML暗号化の基礎と実践 | |
前編〜XML暗号化と正規化と電子署名 | |
1. SSLの利用とXML暗号化の違い | |
2. 電子署名とXML文書の正規化 | |
3. XML文書のアクセスポリシーとシングル・サインオン | |
後編〜XML暗号化と電子署名の実践 | |
4. XMLセキュリティ・スイートを使う | |
5. XML文書に電子署名をしてみる | |
6. 署名された文書の改ざんを検証 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|