Java暗号化アーキテクチャOracleプロバイダのドキュメント(JDK 8用)

次の項目について説明します。

注意: 標準名のドキュメントには、このドキュメントで使用されている標準名に関する詳細な情報が含まれています。

はじめに

Javaプラットフォームでは、暗号化、公開キーインフラストラクチャ、認証、安全な通信、アクセス制御など、主要なセキュリティ分野に渡る一連のAPIが定義されています。これらのAPIによって、開発者はアプリケーション・コードにセキュリティ・メカニズムを簡単に統合できます。Java暗号化アーキテクチャ(JCA)およびそのプロバイダ・アーキテクチャは、Java Development Kit (JDK)のコア概念です。このアーキテクチャについて十分理解していることが前提となります。

このドキュメントでは、OracleのJava環境の一部として提供されているプロバイダの技術的な詳細について説明します。

注: JDKでの暗号化実装は、歴史的な理由および提供するサービスの種類により、さまざまなプロバイダによって配布されています(「Sun」、「SunJSSE」、「SunJCE」、「SunRsaSign」)。汎用アプリケーションは、特定のプロバイダから暗号化サービスを要求しないようにする必要があります。たとえば、次のように指定できます。

getInstance("...", "SunJCE");  // not recommended

getInstance("...");            // recommended

後者のようにしないと、アプリケーションは特定のプロバイダに結び付けられることになり、そのプロバイダはほかのJava実装で使用できない可能性があります。特定の要求されたプロバイダよりも優先順位が高い、使用可能な最適化されたプロバイダ(たとえば、PKCS11によるハードウェア・アクセラレータまたはMicrosoftのMSCAPIなどのネイティブOS実装)を利用できない場合もあります。

暗号化アルゴリズムの輸入制限

デフォルトでは、アプリケーションは、どの強度の暗号化アルゴリズムでも使用できます。ただし、一部の場所での輸入規制のため、それらのアルゴリズムの強度を制限する必要がある場合があります。JDKでは、ディレクトリ<java-home>/jre/lib/security/policyに、暗号化アルゴリズムの強度を決定する2種類の管轄ポリシー・ファイル・セット("limited"および"unlimited")が用意されています。管轄ポリシー・ファイルおよびそのアクティブ化の方法の詳細は、付録C: 暗号強度の構成を参照してください。

自分の場所のための正確な要件を決定する際は、輸出入管理コンサルタントまたは弁護士に相談してください。

制限付きの構成のために、次の表では、制限付きの一連の管轄ポリシー・ファイルで許可されている最大キー・サイズをリストします。

アルゴリズム 最大キー・サイズ
DES 64
DESede *
RC2 128
RC4 128
RC5 128
RSA *
その他すべて 128

暗号の変換

javax.crypto.Cipher.getInstance(String transformation)ファクトリ・メソッドは、algorithm/mode/padding形式の変換を使用してCipherを生成します。モード/パディングを省略すると、SunJCEプロバイダとSunPKCS11プロバイダは、多くの対称暗号でECBをデフォルト・モードとして、PKCS5Paddingをデフォルト・パディングとして使用します。

デフォルトを使用するのではなく、アルゴリズム、モードおよびパディングを完全に指定した変換を使用することをお薦めします。


注意: ECBは、単一のデータ・ブロックに対しては正常に機能し、パラレル化可能ですが、複数のデータ・ブロックには絶対に使用しないでください。


SecureRandom実装

次の表に、利用可能なSecureRandom実装のデフォルトの優先順位を示します。

OS アルゴリズム名 プロバイダ名
Solaris 1. PKCS11* SunPKCS11
2. NativePRNG** Sun
3. SHA1PRNG** Sun
4. NativePRNGBlocking Sun
5. NativePRNGNonBlocking Sun
Linux 1. NativePRNG** Sun
2. SHA1PRNG** Sun
3. NativePRNGBlocking Sun
4. NativePRNGNonBlocking Sun
macOS 1. NativePRNG** Sun
2. SHA1PRNG** Sun
3. NativePRNGBlocking Sun
4. NativePRNGNonBlocking Sun
Windows 1. SHA1PRNG Sun
2. Windows-PRNG*** SunMSCAPI

* SunPKCS11プロバイダはすべてのプラットフォームで利用可能ですが、これがデフォルトで有効になっているのは、ネイティブのPKCS11実装が自動的にインストールおよび構成される唯一のOSであるSolarisのみです。他のプラットフォームでは、アプリケーションまたはデプロイヤが特にネイティブPKCS11ライブラリをインストールして構成し、それを使用できるようにSunPKCS11を構成して有効にする必要があります。

** Solaris、LinuxおよびmacOSでは、java.securityエントロピー収集デバイスfile:/dev/urandomまたはfile:/dev/randomに設定すると、SHA1PRNGよりNativePRNGが優先されます。それ以外の場合は、SHA1PRNGが優先されます。

*** Windowsには現在NativePRNGはありません。同等の機能を利用するには、SunMSCAPIプロバイダを使用します。

JCAフレームワークに登録されたSecureRandom実装が存在しない場合、java.security.SecureRandomはハードコードされたSHA1PRNGを使用します。

SunPKCS11プロバイダ

暗号化トークン・インタフェース標準(PKCS#11)は、ハードウェア暗号化アクセラレータやスマート・カードなどの暗号化メカニズムに対するネイティブ・プログラミング・インタフェースを提供しています。SunPKCS11プロバイダを適切に構成すると、アプリケーションは標準のJCA/JCE APIを使用してネイティブPKCS#11ライブラリにアクセスできるようになります。SunPKCS11プロバイダ自体には暗号化機能は含まれていません。このプロバイダは、Java環境とネイティブPKCS11プロバイダ間のコンジットとして機能します。このプロバイダの詳細は、『Java PKCS#11リファレンス・ガイド』を参照してください。

SUNプロバイダ

JDK 1.1では、Providerアーキテクチャが導入されました。最初のJDKプロバイダにはSUNという名前が付けられ、2種類の暗号化サービス(MessageDigestおよびSignature)が含まれていました。後続のリリースでは、ほかのメカニズムも追加されました(SecureRandom乱数ジェネレータ、KeyPairGeneratorKeyFactoryなど)。

当時有効だった米国の輸出制限事項によって、JDKの内部で使用可能な暗号化機能に重大な制限が課されました。このため、SUNプロバイダには、データを直接暗号化または復号化しない暗号化エンジンが含まれています。

SUNプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
AlgorithmParameterGenerator DSA
AlgorithmParameters DSA
CertificateFactory X.509
CertPathBuilder PKIX
CertPathValidator PKIX
CertStore Collection
LDAP
Configuration JavaLoginConfig
KeyFactory DSA
KeyPairGenerator DSA
KeyStore JKS
DKS
MessageDigest MD2
MD5
SHA-1
SHA-224
SHA-256
SHA-384
SHA-512
Policy JavaPolicy
SecureRandom SHA1PRNG (現在、初期シードはシステム属性とjava.securityのエントロピー収集デバイスとの組合せによって行われています)
NativePRNG (nextBytes()/dev/urandomを使用し、generateSeed()/dev/randomを使用します)
NativePRNGBlocking (nextBytes()およびgenerateSeed()/dev/randomを使用します)
NativePRNGNonBlocking (nextBytes()およびgenerateSeed()/dev/urandomを使用します)
Signature NONEwithDSA
SHA1withDSA
SHA224withDSA
SHA256withDSA

次の表に、SHAメッセージ・ダイジェストに関連付けられたOIDを示します。

SHAメッセージ・ダイジェスト OID
SHA-224 2.16.840.1.101.3.4.2.4
SHA-256 2.16.840.1.101.3.4.2.1
SHA-384 2.16.840.1.101.3.4.2.2
SHA-512 2.16.840.1.101.3.4.2.3

次の表に、DSA署名に関連付けられたOIDを示します。

DSA署名 OID
SHA1withDSA 1.2.840.10040.4.3
1.3.14.3.2.13
1.3.14.3.2.27
SHA224withDSA 2.16.840.1.101.3.4.3.1
SHA256withDSA 2.16.840.1.101.3.4.3.2

キー・サイズ制限

SUNプロバイダでは、次のデフォルト・キーサイズ(ビット単位)を使用し、次の制限を強制します。

KeyPairGenerator

アルゴリズム名前 デフォルト・キーサイズ 制限/コメント
DSA 1024 キー・サイズは、512から1024の範囲で64の倍数であるか、または2048である必要があります。

AlgorithmParameterGenerator

アルゴリズム名前 デフォルト・キーサイズ 制限/コメント
DSA 1024 キー・サイズは、512から1024の範囲で64の倍数であるか、または2048である必要があります。

CertificateFactory/CertPathBuilder/CertPathValidator/CertStore実装

CertificateFactoryCertPathBuilderCertPathValidatorおよびCertStoreに対するSUNプロバイダ実装の詳細は、『PKIプログラマーズ・ガイド』の「付録B」を参照してください。

SunRsaSignプロバイダ

SunRsaSignプロバイダは、SunJSSEプロバイダのRSA署名の機能が拡張された代替機能として、JDK 1.3で導入されました。

SunRsaSignプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
KeyFactory RSA
KeyPairGenerator RSA
Signature MD2withRSA
MD5withRSA
SHA1withRSA
SHA224withRSA
SHA256withRSA
SHA384withRSA
SHA512withRSA

キー・サイズ制限

SunRsaSignプロバイダでは、次のデフォルト・キーサイズ(ビット単位)を使用し、次の制限を強制します。

KeyPairGenerator

アルゴリズム名前 デフォルト・キーサイズ 制限/コメント
RSA 2048 キーサイズは、512から16384ビットの範囲内である必要があります。キー・サイズが3072を超えると、公開指数の長さは64ビットを超えることはできません。

SunJSSEプロバイダ

Java Secure Socket Extension (JSSE)は、個別の「オプション・パッケージ」(「標準拡張機能」とも呼ばれています)としてリリースされ、JDK 1.2.nおよび1.3.nで使用できました。SunJSSEプロバイダはこのリリースの一部として導入されました。

以前のJDKリリースでは、JDKでRSA署名プロバイダは使用できませんでした。このため、SunJSSEでは、共通で使用できるRSAベースの証明書を使用するために独自のRSA実装を提供する必要がありました。JDK 5では、SunRsaSignプロバイダが導入されました。このプロバイダは、SunJSSEプロバイダのすべての機能(およびそれ以上の機能)を提供します。JDK 5.0以降をターゲットにしているアプリケーションは、かわりにSunRsaSignプロバイダのインスタンスを要求する必要があります。RSAアルゴリズムは、下位互換性のためにこのプロバイダでも使用可能ですが、実際にはSunRsaSignプロバイダに実装されています。

アルゴリズム

SunJSSEプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
KeyFactory RSA
KeyManagerFactory

SunX509: X509ExtendedKeyManagerインスタンスのファクトリであり、IETF PKIXワーキング・グループによってRFC 3280またはその後継で定義された規則に従って、ローカル側の認証に使用するX.509証明書ベースのキー・ペアを管理します。このKeyManagerFactoryは、Keystoreオブジェクトを使用した初期化をサポートしますが、現在のところjavax.net.ssl.ManagerFactoryParametersクラスを使用した初期化はサポートしていません。

PKIX: X509ExtendedKeyManagerインスタンスのファクトリであり、IETF PKIXワーキング・グループによってRFC 3280またはその後継で定義された規則に従って、ローカル側の認証に使用するX.509証明書ベースのキー・ペアを管理します。現在、このKeyManagerFactoryは、KeyStoreオブジェクトまたはjavax.net.ssl.KeyStoreBuilderParametersを使用した初期化をサポートしています。

KeyPairGenerator RSA
KeyStore PKCS12脚注1
Signature MD2withRSA
MD5withRSA
SHA1withRSA
SSLContext SSLv3
TLSv1
TLSv1.1
TLSv1.2
TrustManagerFactory

SunX509: X509ExtendedTrustManagerインスタンスのファクトリであり、IETF PKIXワーキング・グループによってRFC 3280またはその後継で定義された規則に従って、証明書チェーンを検証します。このTrustManagerFactoryは、Keystoreオブジェクトを使用した初期化をサポートしますが、現在のところjavax.net.ssl.ManagerFactoryParametersクラスを使用した初期化はサポートしていません。

PKIX: X509ExtendedTrustManagerインスタンスのファクトリであり、IETF PKIXワーキング・グループによってRFC 3280またはその後継で定義された規則に従って、証明書チェーンを検証します。現在、このTrustManagerFactoryは、KeyStoreオブジェクトまたはjavax.net.ssl.CertPathTrustManagerParametersを使用した初期化をサポートしています。

脚注1 -PKCS12 KeyStore実装はKeyBagタイプをサポートしていません。

プロトコル

SunJSSEプロバイダは、次のprotocolパラメータをサポートしています。

プロトコル クライアントではデフォルトで有効 サーバーではデフォルトで有効
SSLv3 いいえ(利用不可脚注2) いいえ(利用不可脚注2)
TLSv1 はい はい
TLSv1.1 はい はい
TLSv1.2 はい はい
SSLv2Hello 脚注1 いいえ はい

脚注1 - SSLv3、TLSv1、TLSv1.1およびTLSv1.2プロトコルを使用すると、SSLv2Hello疑似プロトコルを使用して、SSLv3、TLSv1、TLSv1.1およびTLSv1.2のClientHellosをSSLv2形式のhelloにカプセル化して送信できます。次の表は、SSLv2Hellosの使用時に可能な接続の組合せを示しています。

クライアント サーバー 接続
有効 有効 Y
無効 有効 Y (最も相互運用可能度が高い: SunJSSEデフォルト)
有効 無効 N
無効 無効 Y

脚注2- SSLv3の有効化:

JDK 8u31リリース以降、SSLv3プロトコル(Secure Socket Layer)は無効になっており、デフォルトで使用できません。<JRE_HOME>/lib/security/java.securityファイルのjava.security.Securityプロパティjdk.tls.disabledAlgorithmsを参照してください。

SSLv3が絶対に必要な場合は、java.securityファイルのjdk.tls.disabledAlgorithmsプロパティから"SSLv3"を削除するか、JSSEが初期化される前にこのセキュリティ・プロパティを動的に設定すれば、プロトコルをJREレベルで再度アクティブにできます。

SSLv3プロトコルをデプロイ・レベルで有効化するには、前述のステップに従った後で、deployment.propertiesファイルを編集して、次を追加します。

deployment.security.SSLv3=true

暗号化方式群

SunJSSEは、数多くの暗号化方式群をサポートしています。次の2つの表は、SunJSSEでサポートされている暗号化方式群(優先順)、およびそれらが導入されたリリースを示しています。

1つ目の表には、デフォルトで有効になっている暗号化方式群を示します。2つ目の表には、SunJSSEでサポートされているが、デフォルトでは有効になっていない暗号化方式群を示します。

デフォルトで有効になっている暗号化方式群
暗号化方式群 J2SE v1.4 J2SE v1.4.1、v1.4.2 J2SE 5.0 JDK 6 JDK 7 JDK 8
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384         X脚注1 X
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384         X脚注1 X
TLS_RSA_WITH_AES_256_CBC_SHA256         X脚注1 X
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384         X脚注1 X
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384         X脚注1 X
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256         X脚注1 X
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256         X脚注1 X
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA       X X X
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA       X X X
TLS_RSA_WITH_AES_256_CBC_SHA   X X X X X
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA       X X X
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA       X X X
TLS_DHE_RSA_WITH_AES_256_CBC_SHA   X X X X X
TLS_DHE_DSS_WITH_AES_256_CBC_SHA   X X X X X
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256         X脚注1 X
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256         X脚注1 X
TLS_RSA_WITH_AES_128_CBC_SHA256         X脚注1 X
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256         X脚注1 X
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256         X脚注1 X
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256         X脚注1 X
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256         X脚注1 X
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA       X X X
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA       X X X
TLS_RSA_WITH_AES_128_CBC_SHA   X X X X X
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA       X X X
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA       X X X
TLS_DHE_RSA_WITH_AES_128_CBC_SHA   X X X X X
TLS_DHE_DSS_WITH_AES_128_CBC_SHA   X X X X X
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA       X X X
TLS_ECDHE_RSA_WITH_RC4_128_SHA       X X X
SSL_RSA_WITH_RC4_128_SHA X X X X X X
TLS_ECDH_ECDSA_WITH_RC4_128_SHA       X X X
TLS_ECDH_RSA_WITH_RC4_128_SHA       X X X
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384           X
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256           X
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384           X
TLS_RSA_WITH_AES_256_GCM_SHA384           X
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384           X
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384           X
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384           X
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384           X
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256           X
TLS_RSA_WITH_AES_128_GCM_SHA256           X
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256           X
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256           X
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256           X
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256           X
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA       X X X
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA       X X X
SSL_RSA_WITH_3DES_EDE_CBC_SHA X X X X X X
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA       X X X
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA       X X X
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA   X X X X X
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA X X X X X X
SSL_RSA_WITH_RC4_128_MD5 X X X X X X
TLS_EMPTY_RENEGOTIATION_INFO_SCSV 脚注2   1.4.2u28+ u26+ u22+ X X

脚注1 SHA384およびSHA256を使用する暗号化方式群は、TLS 1.2以降でのみ使用可能です。

脚注2 TLS_EMPTY_RENEGOTIATION_INFO_SCSVは、RFC 5746をサポートするための新しい擬似暗号化方式群です。詳細は、『JSEEリファレンス・ガイド』の「Transport Layer Security (TLS)再ネゴシエーションの問題」の項を参照してください。

デフォルトで無効になっている暗号化方式群
暗号化方式群 J2SE v1.4 J2SE v1.4.1、v1.4.2 J2SE 5.0 JDK 6 JDK 7 JDK 8
TLS_DH_anon_WITH_AES_256_GCM_SHA384           X
TLS_DH_anon_WITH_AES_128_GCM_SHA256           X
TLS_DH_anon_WITH_AES_256_CBC_SHA256         X X
TLS_ECDH_anon_WITH_AES_256_CBC_SHA       X X X
TLS_DH_anon_WITH_AES_256_CBC_SHA   X X X X X
TLS_DH_anon_WITH_AES_128_CBC_SHA256         X X
TLS_ECDH_anon_WITH_AES_128_CBC_SHA       X X X
TLS_DH_anon_WITH_AES_128_CBC_SHA   X X X X X
TLS_ECDH_anon_WITH_RC4_128_SHA       X X X
SSL_DH_anon_WITH_RC4_128_MD5 X X X X X X
TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA       X X X
SSL_DH_anon_WITH_3DES_EDE_CBC_SHA X X X X X X
TLS_RSA_WITH_NULL_SHA256         X X
TLS_ECDHE_ECDSA_WITH_NULL_SHA       X X X
TLS_ECDHE_RSA_WITH_NULL_SHA       X X X
SSL_RSA_WITH_NULL_SHA X X X X X X
TLS_ECDH_ECDSA_WITH_NULL_SHA       X X X
TLS_ECDH_RSA_WITH_NULL_SHA       X X X
TLS_ECDH_anon_WITH_NULL_SHA       X X X
SSL_RSA_WITH_NULL_MD5 X X X X X X
SSL_RSA_WITH_DES_CBC_SHA X X X X X脚注1 X
SSL_DHE_RSA_WITH_DES_CBC_SHA   X X X X脚注1 X
SSL_DHE_DSS_WITH_DES_CBC_SHA X X X X X脚注1 X
SSL_DH_anon_WITH_DES_CBC_SHA X X X X X脚注1 X
SSL_RSA_EXPORT_WITH_RC4_40_MD5 X X X X X脚注2 X
SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 X X X X X脚注2 X
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA   X X X X脚注2 X
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA   X X X X脚注2 X
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA X X X X X脚注2 X
SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA X X X X X脚注2 X
TLS_KRB5_WITH_RC4_128_SHA     X X X X
TLS_KRB5_WITH_RC4_128_MD5     X X X X
TLS_KRB5_WITH_3DES_EDE_CBC_SHA     X X X X
TLS_KRB5_WITH_3DES_EDE_CBC_MD5     X X X X
TLS_KRB5_WITH_DES_CBC_SHA     X X X脚注1 X
TLS_KRB5_WITH_DES_CBC_MD5     X X X脚注1 X
TLS_KRB5_EXPORT_WITH_RC4_40_SHA     X X X脚注2 X
TLS_KRB5_EXPORT_WITH_RC4_40_MD5     X X X脚注2 X
TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA     X X X脚注2 X
TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5     X X X脚注2 X

脚注1 RFC 5246 TLS 1.2では、これらの群の使用は禁止されています。これらは、SSLv3/TLS1.0/TLS1.1プロトコルでは使用できますが、TLS 1.2以降では使用できません。

脚注2 RFC 4346 TLS 1.1では、これらの群の使用は禁止されています。これらは、SSLv3/TLS1.0プロトコルでは使用できますが、TLS 1.1以降では使用できません。

AES_256を使用する暗号化方式群では、強度が無制限のJCE管轄ポリシー・ファイルがインストールされている必要があります。「暗号化アルゴリズムの輸入制限」を参照してください。

楕円曲線暗号(ECDSA、ECDH、ECDHE、ECDH_anon)を使用する暗号化方式群では、次の要件を満たすJCE暗号化プロバイダが必要です。

これらの要件が満たされていない場合、EC暗号化方式群が正しくネゴシエーションされないことがあります。

EncryptedPreMasterSecretバージョン番号チェックの強化

JDK 7リリースより前のSSL/TLS実装では、PreMasterSecret内のバージョン番号がチェックされず、SSL/TLSクライアントからデフォルトで正しいバージョン番号が送信されませんでした。システム・プロパティcom.sun.net.ssl.rsaPreMasterSecretFixtrueに設定されないかぎり、TLSクライアントはアクティブなネゴシエートされたバージョンを送信しますが、クライアントでサポートされる予想最大バージョンは送信しません。

SSLバージョン3.0およびTLSバージョン1.0では、互換性のため、この動作は保持されます。しかし、TLSバージョン1.1以降の実装では、RFC 5246の要求に従って、PreMasterSecretバージョン番号のチェックが強化されています。クライアントは常に正しいバージョン番号を送信し、サーバーはバージョン番号を厳密にチェックします。TLS 1.1以降では、システム・プロパティcom.sun.net.ssl.rsaPreMasterSecretFixは使用されません。

SunJCEプロバイダ

SUNプロバイダ」で簡単に説明されているように、当時の米国の輸出制限事項によって、JDK内で使用できる暗号化機能が制限されていました。このため、アプリケーションでデータの暗号化または復号化を可能にするために、個別のAPIおよびリファレンス実装が開発されました。Java暗号化拡張機能(JCE)は、個別の「オプション・パッケージ」(「標準拡張機能」とも呼ばれています)としてリリースされ、JDK 1.2.xおよび1.3.xで使用できました。JDK 1.4の開発時に制限が緩和されたため、JCE (およびSunJSSE)をJDKの一部としてバンドルできるようになりました。

SunJCEプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
AlgorithmParameterGenerator DiffieHellman
AlgorithmParameters AES
Blowfish
DES
DESede
DiffieHellman
OAEP
PBE
PBES2
PBEWithHmacSHA1AndAES_128
PBEWithHmacSHA224AndAES_128
PBEWithHmacSHA256AndAES_128
PBEWithHmacSHA384AndAES_128
PBEWithHmacSHA512AndAES_128
PBEWithHmacSHA1AndAES_256
PBEWithHmacSHA224AndAES_256
PBEWithHmacSHA256AndAES_256
PBEWithHmacSHA384AndAES_256
PBEWithHmacSHA512AndAES_256
PBEWithMD5AndDES
PBEWithMD5AndTripleDES
PBEWithSHA1AndDESede
PBEWithSHA1AndRC2_40
PBEWithSHA1AndRC2_128
PBEWithSHA1AndRC4_40
PBEWithSHA1AndPC4_128
RC2
Cipher 暗号の表を参照してください。
KeyAgreement DiffieHellman
KeyFactory DiffieHellman
KeyGenerator AES
ARCFOUR
Blowfish
DES
DESede
HmacMD5
HmacSHA1
HmacSHA224
HmacSHA256
HmacSHA384
HmacSHA512
RC2
KeyPairGenerator DiffieHellman
KeyStore JCEKS
Mac HmacMD5
HmacSHA1
HmacSHA224
HmacSHA256
HmacSHA384
HmacSHA512
HmacPBESHA1
PBEWithHmacSHA1
PBEWithHmacSHA224
PBEWithHmacSHA256
PBEWithHmacSHA384
PBEWithHmacSHA512
SecretKeyFactory DES
DESede
PBEWithMD5AndDES
PBEWithMD5AndTripleDES
PBEWithSHA1AndDESede
PBEWithSHA1AndRC2_40
PBEWithSHA1AndRC2_128
PBEWithSHA1AndRC4_40
PBEWithSHA1AndRC4_128
PBKDF2WithHmacSHA1
PBKDF2WithHmacSHA224
PBKDF2WithHmacSHA256
PBKDF2WithHmacSHA384
PBKDF2WithHmacSHA512
PBEWithHmacSHA1AndAES_128
PBEWithHmacSHA224AndAES_128
PBEWithHmacSHA256AndAES_128
PBEWithHmacSHA384AndAES_128
PBEWithHmacSHA512AndAES_128
PBEWithHmacSHA1AndAES_256
PBEWithHmacSHA224AndAES_256
PBEWithHmacSHA256AndAES_256
PBEWithHmacSHA384AndAES_256
PBEWithHmacSHA512AndAES_256

次の表に、SunJCEプロバイダで使用できる暗号アルゴリズムを示します。

アルゴリズム名 モード パディング
AES ECB、CBC、PCBC、CTR、CTS、CFB、CFB8..CFB128、OFB、OFB8..OFB128 NoPadding、PKCS5Padding、ISO10126Padding
AES GCM NoPadding
AESWrap ECB NoPadding
ARCFOUR ECB NoPadding
Blowfish、DES、DESede、RC2 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8..CFB64、OFB、OFB8..OFB64 NoPadding、PKCS5Padding、ISO10126Padding
DESedeWrap CBC NoPadding
PBEWithMD5AndDES、
PBEWithMD5AndTripleDES 脚注1
PBEWithSHA1AndDESede、
PBEWithSHA1AndRC2_40、
PBEWithSHA1AndRC2_128、
PBEWithSHA1AndRC4_40、
PBEWithSHA1AndRC4_128、
PBEWithHmacSHA1AndAES_128、
PBEWithHmacSHA224AndAES_128、
PBEWithHmacSHA256AndAES_128、
PBEWithHmacSHA384AndAES_128、
PBEWithHmacSHA512AndAES_128、
PBEWithHmacSHA1AndAES_256、
PBEWithHmacSHA224AndAES_256、
PBEWithHmacSHA256AndAES_256、
PBEWithHmacSHA384AndAES_256、
PBEWithHmacSHA512AndAES_256
CBC PKCS5Padding
RSA ECB NoPadding、PKCS1Padding、OAEPWithMD5AndMGF1Padding、OAEPWithSHA1AndMGF1Padding、OAEPWithSHA-1AndMGF1Padding、OAEPWithSHA-224AndMGF1Padding、OAEPWithSHA-256AndMGF1Padding、OAEPWithSHA-384AndMGF1Padding、OAEPWithSHA-512AndMGF1Padding

脚注1 PBEWithMD5AndTripleDESは、標準化されていない独自のアルゴリズムです。

キー・サイズ制限

SunJCEプロバイダでは、次のデフォルト・キーサイズ(ビット単位)を使用し、次の制限を強制します:

KeyGenerator

アルゴリズム名 デフォルト・キーサイズ 制限/コメント
AES 128 キー・サイズは128、192、または256にする必要があります。
ARCFOUR (RC4) 128 キー・サイズは、40から1024の範囲内である必要があります。
Blowfish 128 キー・サイズは、32から448の範囲で、8の倍数である必要があります。
DES 56 キー・サイズは56にする必要があります。
DESede (トリプルDES) 168 キー・サイズは112または168にする必要があります。

キー・サイズが112の場合には2つの中間キーを保持するトリプルDESキーが、168の場合には3つの中間キーを保持するトリプルDESキーが、それぞれ生成されます。

「Meet-In-The-Middle」問題のため、112ビットまたは168ビットのキー・データが使用されますが、有効なキー・サイズはそれぞれ80ビットまたは112ビットです。

HmacMD5 512 キー・サイズの制限はありません。
HmacSHA1 512 キー・サイズの制限はありません。
HmacSHA224 224 キー・サイズの制限はありません。
HmacSHA256 256 キー・サイズの制限はありません。
HmacSHA384 384 キー・サイズの制限はありません。
HmacSHA512 512 キー・サイズの制限はありません。
RC2 128 キー・サイズは、40から1024の範囲内である必要があります。

注: 各種のパスワードベース暗号化(PBE)アルゴリズムは、さまざまなアルゴリズムを使用してキー・データを生成し、最終的にターゲットのCipherアルゴリズムに依存します。たとえば、「PBEWithMD5AndDES」は常に56ビットのキーを生成します。

KeyPairGenerator

アルゴリズム名 デフォルト・キーサイズ 制限/コメント
Diffie-Hellman (DH) 1024 キー・サイズは、512から2048の範囲で、64の倍数である必要があります。

AlgorithmParameterGenerator

アルゴリズム名前 デフォルト・キーサイズ 制限/コメント
Diffie-Hellman (DH) 1024 キー・サイズは、512から2048の範囲で、64の倍数である必要があります。

SunJGSSプロバイダ

SunJGSSプロバイダでは、次のアルゴリズムを使用できます。

OID 名前
1.2.840.113554.1.2.2 Kerberos v5
1.3.6.1.5.5.2 SPNEGO

SunSASLプロバイダ

SunSASLプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
SaslClient CRAM-MD5
DIGEST-MD5
EXTERNAL
GSSAPI
PLAIN
SaslServer CRAM-MD5
DIGEST-MD5
GSSAPI

XMLDSigプロバイダ

XMLDSigプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
KeyInfoFactory DOM
TransformService http://www.w3.org/TR/2001/REC-xml-c14n-20010315 - (CanonicalizationMethod.INCLUSIVE)
http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments - (CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS)
http://www.w3.org/2001/10/xml-exc-c14n# - (CanonicalizationMethod.EXCLUSIVE)
http://www.w3.org/2001/10/xml-exc-c14n#WithComments - (CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS)
http://www.w3.org/2000/09/xmldsig#base64 - (Transform.BASE64)
http://www.w3.org/2000/09/xmldsig#enveloped-signature - (Transform.ENVELOPED)
http://www.w3.org/TR/1999/REC-xpath-19991116 - (Transform.XPATH)
http://www.w3.org/2002/06/xmldsig-filter2 - (Transform.XPATH2)
http://www.w3.org/TR/1999/REC-xslt-19991116 - (Transform.XSLT)
XMLSignatureFactory DOM

SunPCSCプロバイダ

SunPCSCプロバイダを使用すると、アプリケーションはJavaスマート・カードI/O APIを使用して、ベースとなるオペレーティング・システムのPC/SCスマート・カード・スタックと相互に作用することができます。一部のオペレーティング・システムでは、PC/SCスタックを使用する前にこれを有効にして構成する必要があることがあります。詳細は、オペレーティング・システムのドキュメントを参照してください。

SolarisおよびLinuxプラットフォームでは、SunPCSCはlibpcsclite.soライブラリを使用してPC/SCスタックにアクセスします。これは、ディレクトリ/usr/$LIBISAおよび/usr/local/$LIBISA内でこのライブラリを検索します。$LIBISAは、32ビットのプラットフォームではlib、64ビットのSolarisプラットフォームではlib/64、64ビットのLinuxプラットフォームではlib64にそれぞれ展開されます。システム・プロパティsun.security.smartcardio.libraryが、代替のlibpcsclite.so実装の完全なファイル名に設定される場合もあります。Windowsプラットフォームでは、SunPCSCは常にwinscard.dllを呼び出すため、Javaレベルの構成は不要であり、行うことができません。

ホスト・プラットフォームでPC/SCが使用可能な場合、SunPCSC実装はTerminalFactory.getDefault()およびTerminalFactory.getInstance("PC/SC")を介して取得できます。PC/SCが使用可能でないか、または正しく構成されていない場合、getInstance()の呼出しはNoSuchAlgorithmExceptionで失敗し、getDefault()は端末をサポートしないJRE組込み実装を返します。

SunPCSCプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
TerminalFactory PC/SC

SunMSCAPIプロバイダ

SunMSCAPIプロバイダを使用すると、アプリケーションは標準のJCA/JCE APIを使用して、Microsoft Windowsプラットフォームのネイティブ暗号化ライブラリ、証明書ストアおよびキー・コンテナにアクセスできます。SunMSCAPIプロバイダ自体には暗号化機能は含まれていません。このプロバイダは、Java環境とWindowsのネイティブ暗号化サービス間のコンジットとして機能します。

SunMSCAPIプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
Cipher RSA RSA/ECB/PKCS1Paddingのみ
KeyPairGenerator RSA
KeyStore Windows-MY

ネイティブMicrosoft Windows MYキーストアを識別するキーストアのタイプ。ユーザーの個人証明書および関連する非公開キーが含まれています。

Windows-ROOT

ネイティブMicrosoft Windows ROOTキーストアを識別するキーストアのタイプ。ルート認証局の証明書およびほかの信頼できる自己署名証明書が含まれています。

SecureRandom Windows-PRNG

ネイティブ擬似乱数生成(PRNG)アルゴリズムの名前。

Signature MD5withRSA
MD2withRSA
NONEwithRSA
SHA1withRSA
SHA256withRSA
SHA384withRSA
SHA512withRSA

キー・サイズ制限

SunMSCAPIプロバイダでは、次のデフォルト・キーサイズ(ビット単位)を使用し、次の制限を強制します:

KeyGenerator

アルゴリズム名前 デフォルト・キーサイズ 制限/コメント
RSA 1024 キー・サイズの範囲は512ビットから16,384ビットです。ベースとなるMicrosoft Windows暗号化サービス・プロバイダによって異なります。

SunECプロバイダ

SunECプロバイダは、楕円曲線暗号(ECC)を実装します。RSAのような従来の暗号システムと比べて、ECCではより小さいキー・サイズで同等のセキュリティが提供されるため、計算の高速化、消費電力の削減、メモリーと帯域幅の節約を実現できます。アプリケーションは、(SunPKCS11を通じて)外部のECCライブラリに依存せずに、標準のJCA/JCE APIを使用してECCの機能にアクセスできます。

SunECプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
AlgorithmParameters EC
KeyAgreement ECDH
KeyFactory EC
KeyPairGenerator EC
Signature NONEwithECDSA
SHA1withECDSA
SHA224withECDSA
SHA256withECDSA
SHA384withECDSA
SHA512withECDSA

キー・サイズ制限

SunECプロバイダでは、次のデフォルト・キーサイズ(ビット単位)を使用し、次の制限を強制します:

KeyPairGenerator

アルゴリズム名前 デフォルト・キーサイズ 制限/コメント
EC 256 キー・サイズは、112から571の範囲内である必要があります。

サポートされる楕円曲線名

SunECプロバイダには、楕円曲線(EC)、楕円曲線Diffie-Hellman (ECDH)および楕円曲線デジタル署名アルゴリズム(ECDSA)の各アルゴリズムで使用する様々な楕円曲線の実装が含まれます。これらの曲線の中には、サイドチャネル攻撃の防止に役立つ最新の式と技術を使用して実装されたものがあります。それ以外には、攻撃に対して脆弱である可能性があるため、使用すべきではないレガシー曲線があります。次の表に、これらの各カテゴリに分類される曲線を示します。

次の表の1列目「曲線名」に、SunECが実装する名前を示します。2列目「オブジェクト識別子」には、EC名のオブジェクト識別子を指定します。3列目「その他の名前/別名」には、その曲線のその他の名前または別名を指定します。1行に表示されている文字列はすべて同じ曲線を表します。たとえば、文字列secp256r11.2.840.10045.3.1.7NIST P-256およびX9.62 prime256v1は同じ曲線を表します。曲線名を使用して、ECGenParameterSpecクラスでECパラメータ生成のパラメータ仕様を作成できます。

推奨曲線

次の表に、SunECプロバイダによって提供され、最新の式と技術を使用して実装される楕円曲線を示します。これらの曲線は推奨されており、「互換性のために保持されるレガシー曲線」に示されている曲線よりも優先する必要があります。

曲線名 オブジェクトID その他の名前/別名
secp256r1 1.2.840.10045.3.1.7 NIST P-256、X9.62 prime256v1
secp384r1 1.3.132.0.34 NIST P-384
secp521r1 1.3.132.0.35 NIST P-521

互換性のために保持されるレガシー曲線

新しい曲線に移行することをお薦めします。

次の表に、SunECプロバイダによって提供され、最新の式と技術を使用して実装されていない楕円曲線を示します。これらの曲線は、互換性の理由から引き続き使用でき、レガシー・システムが新しい曲線に移行する時間を確保できます。これらの実装は、JDKの将来のバージョンで削除または置換されます。

曲線名 オブジェクトID その他の名前/別名
secp112r1 1.3.132.0.6 N/A
secp112r2 1.3.132.0.7 N/A
secp128r1 1.3.132.0.28 N/A
secp128r2 1.3.132.0.29 N/A
secp160k1 1.3.132.0.9 N/A
secp160r1 1.3.132.0.8 N/A
secp160r2 1.3.132.0.30 N/A
secp192k1 1.3.132.0.31 N/A
secp192r1 1.2.840.10045.3.1.1 NIST P-192、X9.62 prime192v1
secp224k1 1.3.132.0.32 N/A
secp224r1 1.3.132.0.33 NIST P-224
secp256k1 1.3.132.0.10 N/A
sect113r1 1.3.132.0.4 N/A
sect113r2 1.3.132.0.5 N/A
sect131r1 1.3.132.0.22 N/A
sect131r2 1.3.132.0.23 N/A
sect163k1 1.3.132.0.1 NIST K-163
sect163r1 1.3.132.0.2 N/A
sect163r2 1.3.132.0.15 NIST B-163
sect193r1 1.3.132.0.24 N/A
sect193r2 1.3.132.0.25 N/A
sect233k1 1.3.132.0.26 NIST K-233
sect233r1 1.3.132.0.27 NIST B-233
sect239k1 1.3.132.0.3 N/A
sect283k1 1.3.132.0.16 NIST K-283
sect283r1 1.3.132.0.17 NIST B-283
sect409k1 1.3.132.0.36 NIST K-409
sect409r1 1.3.132.0.37 NIST B-409
sect571k1 1.3.132.0.38 NIST K-571
sect571r1 1.3.132.0.39 NIST B-571
X9.62 c2tnb191v1 1.2.840.10045.3.0.5 N/A
X9.62 c2tnb191v2 1.2.840.10045.3.0.6 N/A
X9.62 c2tnb191v3 1.2.840.10045.3.0.7 N/A
X9.62 c2tnb239v1 1.2.840.10045.3.0.11 N/A
X9.62 c2tnb239v2 1.2.840.10045.3.0.12 N/A
X9.62 c2tnb239v3 1.2.840.10045.3.0.13 N/A
X9.62 c2tnb359v1 1.2.840.10045.3.0.18 N/A
X9.62 c2tnb431r1 1.2.840.10045.3.0.20 N/A
X9.62 prime192v2 1.2.840.10045.3.1.2 N/A
X9.62 prime192v3 1.2.840.10045.3.1.3 N/A
X9.62 prime239v1 1.2.840.10045.3.1.4 N/A
X9.62 prime239v2 1.2.840.10045.3.1.5 N/A
X9.62 prime239v3 1.2.840.10045.3.1.6 N/A

OracleUcryptoプロバイダ

Solaris専用のセキュリティ・プロバイダであるOracleUcryptoは、Solaris Ucryptoライブラリを利用して、Oracle SPARC T4ベースのオンコア暗号化命令でサポートされる暗号化操作のオフロードと委譲を行います。OracleUcryptoプロバイダ自体には暗号化機能は含まれていません。このプロバイダは、Java環境とSolaris Ucryptoライブラリ間のコンジットとして機能します。

基盤となるSolaris Ucryptoライブラリが特定のアルゴリズムをサポートしない場合は、OracleUcryptoプロバイダもそれをサポートしません。その結果、実行時にサポートされるアルゴリズムは、Solaris UcryptoライブラリがサポートするアルゴリズムとOracleUcryptoプロバイダが認識するアルゴリズムの共通部分になります。

OracleUcryptoプロバイダは、オラクル社のJDKにのみ含まれています。OpenJDKの一部ではありません。

OracleUcryptoプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
Cipher AES
RSA
AES/ECB/NoPadding
AES/ECB/PKCS5Padding
AES/CBC/NoPadding
AES/CBC/PKCS5Padding
AES/CTR/NoPadding
AES/GCM/NoPadding
AES/CFB128/NoPadding
AES/CFB128/PKCS5Padding
RSA/ECB/PKCS1Padding
RSA/ECB/NoPadding
Signature MD5withRSA
SHA1withRSA
SHA256withRSA
SHA384withRSA
SHA512withRSA
MessageDigest MD5
SHA
SHA-256
SHA-384
SHA-512

キー・サイズ制限

OracleUcryptoプロバイダは、デフォルトのキー・サイズまたはキー・サイズ制限を指定しません。これらは、基盤となるSolaris Ucryptoライブラリで指定されます。

OracleUcryptoプロバイダの構成ファイル

OracleUcryptoプロバイダには、$JAVA_HOME/lib/securityディレクトリに配置されたucrypto-solaris.cfgという名前の構成ファイルがあります。デフォルトで無効にするアルゴリズムを指定するには、この構成ファイルを変更します。たとえば、次の構成ファイルは、CFB128モードでのAESをデフォルトで無効にします。

#
# Configuration file for the OracleUcrypto provider
#
disabledServices = {
  Cipher.AES/CFB128/PKCS5Padding
  Cipher.AES/CFB128/NoPadding
}

Appleプロバイダ

Appleプロバイダは、macOSキー・チェーンへのアクセスを提供するjava.security.KeyStoreを実装します。

Appleプロバイダでは、次のアルゴリズムを使用できます。

エンジン アルゴリズム名
KeyStore KeychainStore

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.