Java 暗号化アーキテクチャー (JCA) は,Java プラットフォームにおける暗号化機能へのアクセスおよび開発のためのフレームワークであり,Java Security API (暗号化 API) が含まれている.
輸出規制への対応から,歴史的に暗号化 API は java.security パッケージと javax.crypto パッケージの 2 つに分かれている.java.security パッケージは,輸出規制の対象ではないクラス (Signature や MessageDigest など) が含まれ,javax.crypto パッケージには、輸出規制の対象のクラス (Cipher や KeyAgreement など) が含まれている.
JDK の JCA には、次の 2 つのソフトウェアコンポーネントが含まれる.
暗号化サービスを独自に実装し組み込むことができる.この場合,以下に示すエンジンクラスを実装し,独自のプロバイダパッケージを作成する必要がある.
エンジンクラスは,特定の暗号化アルゴリズムに依存しない特定の型の暗号化サービス機能へのインタフェースを提供している. エンジンクラスが提供するアプリケーションインタフェースは,Service Provider Interface (SPI) として実装される.すなわち,各エンジンクラスに対応する抽象 SPI クラスが存在し,抽象 SPI クラスによって暗号化サービスプロバイダが実装しなければならない Service Provider Interface のメソッドが定義されている.
SPI クラスの名前は,対応するエンジンクラス名のあとに"Spi" を追加した名前である.例えば,Signature エンジンクラスに対応する SPI クラスは,SignatureSpi クラスである. 各 SPI クラスは,抽象クラスであり,指定したアルゴリズムに対する特定の型のサービスの実装を提供するには,対応する SPI クラスをサブクラス化してすべての抽象メソッドの実装を提供する必要がある.具体的には,engineSign メソッドなどの "engine" で始まる名称のメソッドを全て実装する.
プロバイダによる Cipher,KeyAgreement,KeyGenerator,MAC,または SecretKey ファクトリの実装 (クラス) をインスタンス化する際,JCA フレームワークはプロバイダのコードベース (JAR ファイル) を判定し,その署名を検証する.これにより,JCA はプロバイダを認証して,信頼されたエンティティーにより署名されたプロバイダだけが JCA にプラグインできる.このため,暗号化プロバイダは署名付きにする必要がある.
$(JAVA_HOME)/lib/ext
ここで,$(JAVA_HOME) は,Java ランタイム (JRE) のインストール先ディレクトリ,または Java JDK の jre ディレクトリを指す.$(JAVA_HOME)/lib/security/java.security
このファイルは,プロバイダごとに次の形式の文を保持している.security.provider.n = masterClassName
これはプロバイダを宣言し,その優先順位 n を指定している.優先順位とは,特定プロバイダの指定がないときに要求されたアルゴリズムについてプロバイダを検索する順序である.順位は 1 から始まり,値が小さい方が優先順位が高い.security.provider.10 = com.cryptox.provider.CryptoX
と 1 行追加する.java.security.Security.addProvider(new com.cryptox.provider.CryptoX());
なお,実行できるのは次の権限を付与されたコードだけである.java.security.SecurityPermission "insertProvider.name"
ここで,name には実際のプロバイダ名を指定する.Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8
を取得した後,zipファイルを解凍し,ファイル内に入っている US_export_policy.jar と local_policy.jar を以下の場所にコピー(同名ファイルを上書き)する.$(JAVA_HOME)/jre/lib/security
これにより,暗号強度制限は解除される.