Cosminexus V9 アプリケーションサーバ Cosminexus XML Security - Core ユーザーズガイド

[目次][用語][索引][前へ][次へ]

4.2.1 XMLデータの要素またはコンテンツを暗号化する

この項では,XMLデータの要素またはコンテンツを暗号化するアプリケーションの開発の流れを,コーディング例を示して説明します。

<この項の構成>
(1) XMLデータのDocumentオブジェクトの生成
(2) 暗号アルゴリズムの指定
(3) 暗号データの生成
(4) 暗号構文の構築
(5) 暗号データの出力

(1) XMLデータのDocumentオブジェクトの生成

JAXPのDocumentBuilderを使用して暗号化したいXML文書を読み込み,Documentオブジェクトを取得します。Documentオブジェクトを取得するときに,名前空間が有効になるように設定してください。コーディングの例を次に示します。

        DocumentBuilderFactory dbf =
                DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        Document doc = dbf.newDocumentBuilder().parse(input);

(2) 暗号アルゴリズムの指定

XMLEncryptionFactoryクラスを使用してXMLEncryptionオブジェクトを生成し,暗号化に必要な暗号アルゴリズムを指定します。ここでは,暗号アルゴリズムにTripleDESを指定する場合のコーディングの例を示します。

        XMLEncryptionFactory xef =
                XMLEncryptionFactory.newInstance();
        EncryptionMethod em = xef.newEncryptionMethod(
                EncryptionMethod.URI_TRIPLEDES, null);
        XMLEncryption xenc = xef.newXMLEncryption(em, null);

(3) 暗号データの生成

暗号データを生成するときは,コンテキストおよび暗号化対象を指定してから,暗号データを生成します。ここでは,次の三つの処理について,コーディング例を示して説明します。

(a) コンテキストの設定

データの暗号化に必要なコンテキストを設定します。暗号化に使用するデータ暗号化鍵で鍵リゾルバを生成し,コンテキストに鍵リゾルバを設定します。コンテキストの処理モードは,「暗号化」を指定してください。コーディングの例を次に示します。

        XMLSecurityContext context = new XMLSecurityContext(
                XMLSecurityContext.Mode.ENCRYPT, doc);
        context.setKeyResolver(
                new AdhocKeyResolver(Utilities.getSecretKey()));
(b) 暗号化対象の指定

暗号化の対象とする個所を指定します。CreditCard要素を指定して暗号化する場合のコーディングの例を次に示します。

        Element elem = Utilities.getElement(
                doc, "http://example.org/payment","CreditCard");
        if (elem == null) {
                throw new Exception("missing p:CreditCard");
        }
        DOMFragment toBeEncrypted = new DOMFragment(elem);

なお,CreditCard要素のコンテンツを指定して暗号化したい場合は,DOMFragment toBeEncrypted =の部分を次のようにコーディングします。

          DOMFragment toBeEncrypted =
                new DOMFragment(elem.getFirstChild(),
                  elem.getLastChild());
(c) 暗号データの生成

「(b) 暗号化対象の指定」で指定した個所の暗号値を計算します。コーディングの例を次に示します。

        DataContainer encrypted =
                xenc.encryptXML(context, toBeEncrypted);

(4) 暗号構文の構築

XMLEncryptionFactoryクラスを使用して,EncryptedData要素以下の構文に対応するオブジェクトを生成します。この場合,CipherValue要素を使用して「(3)(c) 暗号データの生成」で計算した暗号値を設定します。次に,EncryptedDataクラスのreplaceメソッドを使用して,「(3)(b) 暗号化対象の指定」で指定した部分をEncryptedData要素に置き換えます。

暗号化するデータが要素なのかコンテンツなのかは,EncryptedData要素のType属性で指定しておきます。また,暗号値をCipherValueではなく別の場所に格納する場合は,CipherReference要素を使用して,暗号値を参照する必要があります。

ここでは,CipherValue要素を使用して,要素を暗号化する場合のコーディングの例を示します。

        CipherData cd = xef.newCipherData(xef.newCipherValue(
                encrypted.getAsByteArray()));
        EncryptedData ed = xef.newEncryptedData(em, null, cd, null);
        ed.setType(EncryptedData.URI_TYPE_ELEMENT);
        ed.replace(context, toBeEncrypted);

(5) 暗号データの出力

XMLSerializerクラスを使用して,暗号化したい部分をEncryptedData要素に置き換えたDocumentオブジェクトをXML形式で出力します。冗長な名前空間を省略し,Shift_JISで出力する場合のコーディングの例を次に示します。

        XMLOutputFormat format = new XMLOutputFormat();
        format.setOmitRedundantNamespaceDecls(true);
        format.setEncoding("Shift_JIS");
        OutputStream os = new BufferedOutputStream(
                new FileOutputStream(output));
        XMLSerializer xsr = new XMLSerializer(os, format);
        xsr.serialize(doc);
        os.close();