アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング Java 実装技術

Javaでサポートする暗号化アルゴリズム

投稿日:

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アルゴリズムが使われます。

...
#
# 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”(文字列)が設定されています。

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);
		}

	}

	/**
	 * プロバイダに含まれる各サービスの情報を出力する。
	 * 
	 * @param type     タイプ
	 * @param provider JCEプロバイダ
	 */
	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)で実行した際の結果は次の通りです。
出力の列は、左からプロバイダ名、サービスのタイプ、アルゴリズム名です。

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


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, Java, 実装技術

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

WindowsにApacheを構築

アプリケーション開発環境として主にWindowsを使っています。 開発時の検証で使用するミドルウェアがApacheを使用することが多いので、ここでは開発環境であるWindowsにApacheを構築する …

DOSバッチリファレンス

ちょっとした事でbatファイルを作成することが多い。 そのたびにネット検索するのが非効率なため、リファレンス化しようと思う。 そういう目的なので、自分がよく調べる項目に絞っている。 開発時の注意点 直 …

テキストファイルマスクツール

本番環境での性能検証でNGになってしまった。 どの処理でどれほどの処理時間がかかっているかを把握するためにログレベルを変更して、ログを取得した。 対応方法を自社の担当者と検討するために、本番環境からこ …

EAP7のインストールとパッチ適用

仕事でredhat社のEnterprise Application Server7(EAP7)を扱うことが多いので備忘録として記載します。 なお、このサイトでWebアプリを公開したいと考えていますが、 …

JBoss EAP7でDEBUG/TRACEログを出力

JBoss EAP7でアプリのDEBUGやTRACEのログを出力する方法を記載します。 開発の序盤でアプリのDEBUGログがeclipseのコンソールやログファイルに出力されず、困る場合があるので、メ …

プロフィール ゆっきーです。
都内でシステムエンジニアをやっています。
もっと詳細を見る