Java暗号化アーキテクチャ
Javaで暗号化処理を実装する場合、Java暗号化アーキテクチャ(Java Cryptography Architecture: JCA)と呼ばれるフレームワークを使います。
このフレームワークでは、使用する暗号化アルゴリズムを実行環境で変更できるようにするために、プロバイダアーキテクチャと呼ばれる仕組みになっています。Javaで提供する標準的な暗号化アルゴリズム、ベンダが独自に実装した暗号化アルゴリズムは、プロバイダと呼ばれる単位(クラスやjarファイル)で提供されます。Java実行環境の設定ファイルを変更することで、どのプロバイダのアルゴリズムを使用するかを指定することもできます。
JCAとJCE
JCAと並んでよく出てくる言葉として、Java Cryptography Extension(JCE)がある。Java8等の新し目のドキュメントを見てもちょっとピンとこない…
JCAが出た当時のドキュメントに記載がありました。
JavaTM Cryptography Architecture API Specification & Reference(2002):
The Java Cryptography Extension (JCE) extends the JCA API to include APIs for encryption, key exchange, and Message Authentication Code (MAC). Together, the JCE and the cryptography aspects of the SDK provide a complete, platform-independent cryptography API. JCE was previously an optional package (extension) to the Java 2 SDK, Standard Edition, versions 1.2.x and 1.3.x. JCE has now been integrated into the Java 2 SDK, v 1.4.
This document is both a high-level description and a specification of the Java Cryptography Architecture API and its default provider, as shipped in the Java 2 SDK. A separate document describing the JCE API is provided with the JCE release. See the “Java Security Architecture Specification” for information about the Java Security Architecture aspects of the Security API.
自分流に纏めると次の通り。
- JCAはフレームワークであり、プロバイダアーキテクチャ等のコンセプト、暗号機能の使用や拡張を可能とするAPIを提供する。
- JCEは、JCA APIに暗号化・鍵交換・メッセージ認証(MAC)を追加したAPI、とのこと。
- 以前はJava(JCA API含む)とJCEは分離して提供されていたが、JDK1.4以降ではどちらもJDKに含まれている。
プロバイダの指定
使用するプロバイダはJava実行環境のプロパティファイルで指定します。
- JDKの場合: %JAVA_HOME%\jre\lib\security\java.security
- JREの場合: %JAVA_HOME%\lib\security\java.security
設定ファイルでプロバイダを指定する箇所は次の通りです。
プロバイダを追加する場合、そのプロバイダを開発したベンダから設定方法が公開されているはずなので、その指示に従って他の行と同様に行を追加します。
security.provider.Xの部分の番号は、アルゴリズム(実装)を探す場合の順番を意味しています。例えば、SHA-1アルゴリズムを複数のプロバイダで実装していた状況で、SHA-1を使おうとすると、番号の小さいプロバイダが提供するSHA-1アルゴリズムが使われます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ... # # List of providers and their preference orders (see above): # security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=sun.security.ec.SunEC security.provider.4=com.sun.net.ssl.internal.ssl.Provider security.provider.5=com.sun.crypto.provider.SunJCE security.provider.6=sun.security.jgss.SunProvider security.provider.7=com.sun.security.sasl.Provider security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.9=sun.security.smartcardio.SunPCSC security.provider.10=sun.security.mscapi.SunMSCAPI ... |
追加したプロバイダクラスが含まれるjarを次の場所に配置します。
(このフォルダは、Java拡張のためのjar群を配置するフォルダであり、暗号化以外のjarも配置されています。)
- JDKの場合: %JAVA_HOME%\jre\lib\ext
- JREの場合: %JAVA_HOME%\lib\ext
実行環境のプロバイダ、アルゴリズム
実行環境のプロバイダやアルゴリズムを全て列挙するサンプルは次の通りです。
プロバイダが提供する機能はサービスという単位で実装されているので、プロバイダからサービス一覧を取得し、その内容を出力しています。
サービスには型(type)が設定されており、例えばハッシュ関数(メッセージダイジェスト)の場合は、”MessageDigest”(文字列)が設定されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package example; import java.security.Provider; import java.security.Provider.Service; import java.security.Security; import java.util.Set; public class JceProviderInspect { public static void main(String[] args) { // 登録されているJCEプロバイダ一覧を取得 Provider[] providers = Security.getProviders(); // プロバイダ毎で提供される全てのサービスを出力 for (Provider provider : providers) { showServices(null, provider); // showServices(MessageDigest.class.getSimpleName(), provider); } } public static void showServices(String type, Provider provider) { Set<Service> serviceSet = provider.getServices(); for (Service service : serviceSet) { if (type == null || service.getType().equals(type)) { System.out.print(provider.getName()); System.out.print("," + service.getType()); System.out.print("," + service.getAlgorithm()); System.out.println(); } } } } |
プロバイダ・アルゴリズムの例
参考として開発環境(openjdk-1.8)で実行した際の結果は次の通りです。
出力の列は、左からプロバイダ名、サービスのタイプ、アルゴリズム名です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | SUN,SecureRandom,SHA1PRNG SUN,Signature,SHA1withDSA SUN,Signature,NONEwithDSA SUN,Signature,SHA224withDSA SUN,Signature,SHA256withDSA SUN,KeyPairGenerator,DSA SUN,MessageDigest,MD2 SUN,MessageDigest,MD5 SUN,MessageDigest,SHA SUN,MessageDigest,SHA-224 SUN,MessageDigest,SHA-256 SUN,MessageDigest,SHA-384 SUN,MessageDigest,SHA-512 SUN,AlgorithmParameterGenerator,DSA SUN,AlgorithmParameters,DSA SUN,KeyFactory,DSA SUN,CertificateFactory,X.509 SUN,KeyStore,JKS SUN,KeyStore,CaseExactJKS SUN,KeyStore,DKS SUN,Policy,JavaPolicy SUN,Configuration,JavaLoginConfig SUN,CertPathBuilder,PKIX SUN,CertPathValidator,PKIX SUN,CertStore,LDAP SUN,CertStore,Collection SUN,CertStore,com.sun.security.IndexedCollection SunRsaSign,KeyFactory,RSA SunRsaSign,KeyPairGenerator,RSA SunRsaSign,Signature,MD2withRSA SunRsaSign,Signature,MD5withRSA SunRsaSign,Signature,SHA1withRSA SunRsaSign,Signature,SHA224withRSA SunRsaSign,Signature,SHA256withRSA SunRsaSign,Signature,SHA384withRSA SunRsaSign,Signature,SHA512withRSA SunEC,KeyFactory,EC SunEC,AlgorithmParameters,EC SunEC,Signature,NONEwithECDSA SunEC,Signature,SHA1withECDSA SunEC,Signature,SHA224withECDSA SunEC,Signature,SHA256withECDSA SunEC,Signature,SHA384withECDSA SunEC,Signature,SHA512withECDSA SunEC,KeyPairGenerator,EC SunEC,KeyAgreement,ECDH SunJSSE,KeyFactory,RSA SunJSSE,KeyPairGenerator,RSA SunJSSE,Signature,MD2withRSA SunJSSE,Signature,MD5withRSA SunJSSE,Signature,SHA1withRSA SunJSSE,Signature,MD5andSHA1withRSA SunJSSE,KeyManagerFactory,SunX509 SunJSSE,KeyManagerFactory,NewSunX509 SunJSSE,TrustManagerFactory,SunX509 SunJSSE,TrustManagerFactory,PKIX SunJSSE,SSLContext,TLSv1 SunJSSE,SSLContext,TLSv1.1 SunJSSE,SSLContext,TLSv1.2 SunJSSE,SSLContext,TLS SunJSSE,SSLContext,Default SunJSSE,KeyStore,PKCS12 SunJCE,Cipher,RSA SunJCE,Cipher,DES SunJCE,Cipher,DESede SunJCE,Cipher,DESedeWrap SunJCE,Cipher,PBEWithMD5AndDES SunJCE,Cipher,PBEWithMD5AndTripleDES SunJCE,Cipher,PBEWithSHA1AndDESede SunJCE,Cipher,PBEWithSHA1AndRC2_40 SunJCE,Cipher,PBEWithSHA1AndRC2_128 SunJCE,Cipher,PBEWithSHA1AndRC4_40 SunJCE,Cipher,PBEWithSHA1AndRC4_128 SunJCE,Cipher,PBEWithHmacSHA1AndAES_128 SunJCE,Cipher,PBEWithHmacSHA224AndAES_128 SunJCE,Cipher,PBEWithHmacSHA256AndAES_128 SunJCE,Cipher,PBEWithHmacSHA384AndAES_128 SunJCE,Cipher,PBEWithHmacSHA512AndAES_128 SunJCE,Cipher,PBEWithHmacSHA1AndAES_256 SunJCE,Cipher,PBEWithHmacSHA224AndAES_256 SunJCE,Cipher,PBEWithHmacSHA256AndAES_256 SunJCE,Cipher,PBEWithHmacSHA384AndAES_256 SunJCE,Cipher,PBEWithHmacSHA512AndAES_256 SunJCE,Cipher,Blowfish SunJCE,Cipher,AES SunJCE,Cipher,AES_128/ECB/NoPadding SunJCE,Cipher,AES_128/CBC/NoPadding SunJCE,Cipher,AES_128/OFB/NoPadding SunJCE,Cipher,AES_128/CFB/NoPadding SunJCE,Cipher,AES_128/GCM/NoPadding SunJCE,Cipher,AES_192/ECB/NoPadding SunJCE,Cipher,AES_192/CBC/NoPadding SunJCE,Cipher,AES_192/OFB/NoPadding SunJCE,Cipher,AES_192/CFB/NoPadding SunJCE,Cipher,AES_192/GCM/NoPadding SunJCE,Cipher,AES_256/ECB/NoPadding SunJCE,Cipher,AES_256/CBC/NoPadding SunJCE,Cipher,AES_256/OFB/NoPadding SunJCE,Cipher,AES_256/CFB/NoPadding SunJCE,Cipher,AES_256/GCM/NoPadding SunJCE,Cipher,AESWrap SunJCE,Cipher,AESWrap_128 SunJCE,Cipher,AESWrap_192 SunJCE,Cipher,AESWrap_256 SunJCE,Cipher,RC2 SunJCE,Cipher,ARCFOUR SunJCE,KeyGenerator,DES SunJCE,KeyGenerator,DESede SunJCE,KeyGenerator,Blowfish SunJCE,KeyGenerator,AES SunJCE,KeyGenerator,RC2 SunJCE,KeyGenerator,ARCFOUR SunJCE,KeyGenerator,HmacMD5 SunJCE,KeyGenerator,HmacSHA1 SunJCE,KeyGenerator,HmacSHA224 SunJCE,KeyGenerator,HmacSHA256 SunJCE,KeyGenerator,HmacSHA384 SunJCE,KeyGenerator,HmacSHA512 SunJCE,KeyPairGenerator,DiffieHellman SunJCE,AlgorithmParameterGenerator,DiffieHellman SunJCE,KeyAgreement,DiffieHellman SunJCE,AlgorithmParameters,DiffieHellman SunJCE,AlgorithmParameters,DES SunJCE,AlgorithmParameters,DESede SunJCE,AlgorithmParameters,PBE SunJCE,AlgorithmParameters,PBEWithMD5AndDES SunJCE,AlgorithmParameters,PBEWithMD5AndTripleDES SunJCE,AlgorithmParameters,PBEWithSHA1AndDESede SunJCE,AlgorithmParameters,PBEWithSHA1AndRC2_40 SunJCE,AlgorithmParameters,PBEWithSHA1AndRC2_128 SunJCE,AlgorithmParameters,PBEWithSHA1AndRC4_40 SunJCE,AlgorithmParameters,PBEWithSHA1AndRC4_128 SunJCE,AlgorithmParameters,PBES2 SunJCE,AlgorithmParameters,PBEWithHmacSHA1AndAES_128 SunJCE,AlgorithmParameters,PBEWithHmacSHA224AndAES_128 SunJCE,AlgorithmParameters,PBEWithHmacSHA256AndAES_128 SunJCE,AlgorithmParameters,PBEWithHmacSHA384AndAES_128 SunJCE,AlgorithmParameters,PBEWithHmacSHA512AndAES_128 SunJCE,AlgorithmParameters,PBEWithHmacSHA1AndAES_256 SunJCE,AlgorithmParameters,PBEWithHmacSHA224AndAES_256 SunJCE,AlgorithmParameters,PBEWithHmacSHA256AndAES_256 SunJCE,AlgorithmParameters,PBEWithHmacSHA384AndAES_256 SunJCE,AlgorithmParameters,PBEWithHmacSHA512AndAES_256 SunJCE,AlgorithmParameters,Blowfish SunJCE,AlgorithmParameters,AES SunJCE,AlgorithmParameters,GCM SunJCE,AlgorithmParameters,RC2 SunJCE,AlgorithmParameters,OAEP SunJCE,KeyFactory,DiffieHellman SunJCE,SecretKeyFactory,DES SunJCE,SecretKeyFactory,DESede SunJCE,SecretKeyFactory,PBEWithMD5AndDES SunJCE,SecretKeyFactory,PBEWithMD5AndTripleDES SunJCE,SecretKeyFactory,PBEWithSHA1AndDESede SunJCE,SecretKeyFactory,PBEWithSHA1AndRC2_40 SunJCE,SecretKeyFactory,PBEWithSHA1AndRC2_128 SunJCE,SecretKeyFactory,PBEWithSHA1AndRC4_40 SunJCE,SecretKeyFactory,PBEWithSHA1AndRC4_128 SunJCE,SecretKeyFactory,PBEWithHmacSHA1AndAES_128 SunJCE,SecretKeyFactory,PBEWithHmacSHA224AndAES_128 SunJCE,SecretKeyFactory,PBEWithHmacSHA256AndAES_128 SunJCE,SecretKeyFactory,PBEWithHmacSHA384AndAES_128 SunJCE,SecretKeyFactory,PBEWithHmacSHA512AndAES_128 SunJCE,SecretKeyFactory,PBEWithHmacSHA1AndAES_256 SunJCE,SecretKeyFactory,PBEWithHmacSHA224AndAES_256 SunJCE,SecretKeyFactory,PBEWithHmacSHA256AndAES_256 SunJCE,SecretKeyFactory,PBEWithHmacSHA384AndAES_256 SunJCE,SecretKeyFactory,PBEWithHmacSHA512AndAES_256 SunJCE,SecretKeyFactory,PBKDF2WithHmacSHA1 SunJCE,SecretKeyFactory,PBKDF2WithHmacSHA224 SunJCE,SecretKeyFactory,PBKDF2WithHmacSHA256 SunJCE,SecretKeyFactory,PBKDF2WithHmacSHA384 SunJCE,SecretKeyFactory,PBKDF2WithHmacSHA512 SunJCE,Mac,HmacMD5 SunJCE,Mac,HmacSHA1 SunJCE,Mac,HmacSHA224 SunJCE,Mac,HmacSHA256 SunJCE,Mac,HmacSHA384 SunJCE,Mac,HmacSHA512 SunJCE,Mac,HmacPBESHA1 SunJCE,Mac,PBEWithHmacSHA1 SunJCE,Mac,PBEWithHmacSHA224 SunJCE,Mac,PBEWithHmacSHA256 SunJCE,Mac,PBEWithHmacSHA384 SunJCE,Mac,PBEWithHmacSHA512 SunJCE,Mac,SslMacMD5 SunJCE,Mac,SslMacSHA1 SunJCE,KeyStore,JCEKS SunJCE,KeyGenerator,SunTlsPrf SunJCE,KeyGenerator,SunTls12Prf SunJCE,KeyGenerator,SunTlsMasterSecret SunJCE,KeyGenerator,SunTlsKeyMaterial SunJCE,KeyGenerator,SunTlsRsaPremasterSecret SunJGSS,GssApiMechanism,1.2.840.113554.1.2.2 SunJGSS,GssApiMechanism,1.3.6.1.5.5.2 SunSASL,SaslClientFactory,DIGEST-MD5 SunSASL,SaslClientFactory,NTLM SunSASL,SaslClientFactory,GSSAPI SunSASL,SaslClientFactory,EXTERNAL SunSASL,SaslClientFactory,PLAIN SunSASL,SaslClientFactory,CRAM-MD5 SunSASL,SaslServerFactory,CRAM-MD5 SunSASL,SaslServerFactory,GSSAPI SunSASL,SaslServerFactory,DIGEST-MD5 SunSASL,SaslServerFactory,NTLM XMLDSig,TransformService,http://www.w3.org/2006/12/xml-c14n11#WithComments XMLDSig,TransformService,http://www.w3.org/2000/09/xmldsig#base64 XMLDSig,TransformService,http://www.w3.org/TR/1999/REC-xslt-19991116 XMLDSig,TransformService,http://www.w3.org/2001/10/xml-exc-c14n# XMLDSig,TransformService,http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments XMLDSig,TransformService,http://www.w3.org/2000/09/xmldsig#enveloped-signature XMLDSig,TransformService,http://www.w3.org/2002/06/xmldsig-filter2 XMLDSig,XMLSignatureFactory,DOM XMLDSig,TransformService,http://www.w3.org/TR/2001/REC-xml-c14n-20010315 XMLDSig,TransformService,http://www.w3.org/2001/10/xml-exc-c14n#WithComments XMLDSig,TransformService,http://www.w3.org/2006/12/xml-c14n11 XMLDSig,TransformService,http://www.w3.org/TR/1999/REC-xpath-19991116 XMLDSig,KeyInfoFactory,DOM SunPCSC,TerminalFactory,PC/SC SunMSCAPI,SecureRandom,Windows-PRNG SunMSCAPI,KeyStore,Windows-MY SunMSCAPI,KeyStore,Windows-ROOT SunMSCAPI,Signature,NONEwithRSA SunMSCAPI,Signature,SHA1withRSA SunMSCAPI,Signature,SHA256withRSA SunMSCAPI,Signature,SHA384withRSA SunMSCAPI,Signature,SHA512withRSA SunMSCAPI,Signature,MD5withRSA SunMSCAPI,Signature,MD2withRSA SunMSCAPI,KeyPairGenerator,RSA SunMSCAPI,Cipher,RSA SunMSCAPI,Cipher,RSA/ECB/PKCS1Padding |