NDW

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

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






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


comment

メールアドレスが公開されることはありません。

関連記事

Excel VBAでJSONを自動生成

サンプルExcelシートの説明 Excelシート上に記載したフィールドや値をJSONに出力できます。 「配列」(I列)、「型」(J列)を変更することで、JSONへの値の出力仕様を変更できます。JSON …

WindowsでQRコードを生成(VBScript)

概要 Windows環境でVBScriptを使用してQRコードを生成する方法を紹介します。 このVBScriptは、Excelを起動し、バーコードコントロールを使ってQRコードを生成しています。 動作 …

Windowsの証明書ストアの基礎知識と確認方法

※証明書ストア、システムストア、物理ストアの厳密な定義や違いを読み解けなかったため、マイクロソフトのリファレンスを意訳して言葉を使用しています。 証明書ストアの基礎 証明書は「ローカルコンピューター」 …

jQueryによるデフォルトボタンの実装

デフォルトボタンについて Webページ上でエンターキーを押した場合、そのページ上であらかじめ決められたボタンをクリックしたかのように処理を実行する仕組みがある。何らかのデータの検索を行うようなページは …

JIS X 0208, Shift_JIS, Windows-31Jの歴史と違い

文字コードの話は難しそうなイメージがあり、必要になったタイミングでその都度、最小限の知識を習得して対応してきました…が、効率が悪く踏み込んだ話になった時に困る場合もあるので、ここで真面目に …