- すべての実装されたインタフェース:
Serializable,RandomGenerator
強力な暗号化による乱数は、「FIPS 140-2, Security Requirements for Cryptographic Modules」のセクション4.9.1に指定されている統計的乱数生成テストに最低限適合しています。 さらに、SecureRandomは、非決定論的な出力を生成する必要があります。 したがって、SecureRandomオブジェクトに渡されるシード・マテリアルは予測できない必要があり、「RFC 4086: セキュリティのランダム性要件」で説明されているように、すべてのSecureRandom出力シーケンスは暗号的に強力である必要があります。
多くのSecureRandom実装は、疑似乱数ジェネレータ(PRNGは、確定的ランダム・ビット発生器またはDRBGとしても知られている)の形をとります。つまり、ランダム・シードから疑似ランダム・シーケンスを生成するために決定論的アルゴリズムを使用します。 実装の中には、真の乱数を生成するものもあれば、両方の技術の組み合わせを使用するものもあります。
呼び出し元は、引数のないコンストラクタまたはgetInstanceメソッドの1つを使用してSecureRandomインスタンスを取得します。 たとえば、
SecureRandom r1 = new SecureRandom();
SecureRandom r2 = SecureRandom.getInstance("NativePRNG");
SecureRandom r3 = SecureRandom.getInstance("DRBG",
DrbgParameters.instantiation(128, RESEED_ONLY, null));
上記の3番目の文は、特定のインスタンス化パラメータをサポートする特定のアルゴリズムのSecureRandomオブジェクトを返します。 実装の有効なインスタンス化パラメータは、この最小限のリクエストと一致する必要がありますが、必ずしも同じである必要はありません。 たとえば、リクエストに特定の機能が必要ない場合でも、実際のインスタンシエーションによってその機能が提供されます。 実装は、実際に使用されるまでSecureRandomを遅延インスタンス化することができますが、有効なインスタンス化パラメータは作成直後に決定されなければならず、getParameters()は常に同じ結果をそのまま返します。
SecureRandomの典型的な呼び出し元は、以下のメソッドを呼び出してランダムなバイトを取得します:
SecureRandom random = new SecureRandom(); byte[] bytes = new byte[20]; random.nextBytes(bytes);
呼び出し側は、generateSeed(int)メソッドを呼び出して、指定された数のシード・バイトを生成することもできます。(他の乱数発生器をシード):
byte[] seed = random.generateSeed(20);
新しく作成されたPRNG SecureRandomオブジェクトは、(SecureRandom(byte[])によって作成されている場合を除き)にシードされません。 nextBytesへの最初の呼び出しは、実装固有のエントロピ・ソースから自身をシードするよう強制します。 setSeedが以前に呼び出されている場合、この自己シードは行われません。
SecureRandomは、いつでもreseedまたはsetSeedメソッドを呼び出すことによって再シードすることができます。 reseedメソッドはエントロピ入力からエントロピ入力を読み込み、それ自身を再シードします。 setSeedメソッドは、呼び出し元にシードを提供する必要があります。
reseedは、すべてのSecureRandom実装でサポートされているわけではないことに注意してください。
いくつかのSecureRandom実装は、メソッドの動作をさらに制御するために、nextBytes(byte[], SecureRandomParameters)およびreseed(SecureRandomParameters)メソッドでSecureRandomParametersパラメータを受け入れることができます。
ノート: 実装によっては、エントロピ・ソースがさまざまなUnixライクなオペレーティング・システム上で/dev/randomである場合など、generateSeed、reseedおよびnextBytesメソッドは、エントロピが収集されるにつれてブロックされる可能性があります。
スレッドの安全性
SecureRandomオブジェクトは、複数の同時スレッドで安全に使用できます。- 実装要件:
SecureRandomサービス・プロバイダは、プロバイダを登録するときに「サービス・プロバイダ属性」 "ThreadSafe"を"true"に設定することによって、スレッド・セーフであることを通知できます。 それ以外の場合、このクラスは代わりにSecureRandomSpi実装の次のメソッドへのアクセスを同期します:- 導入されたバージョン:
- 1.1
- 関連項目:
-
ネストされたクラスのサマリー
インタフェースjava.util.random.RandomGeneratorで宣言されたネストされたクラス/インタフェース
RandomGenerator.ArbitrarilyJumpableGenerator, RandomGenerator.JumpableGenerator, RandomGenerator.LeapableGenerator, RandomGenerator.SplittableGenerator, RandomGenerator.StreamableGenerator -
コンストラクタのサマリー
コンストラクタ修飾子コンストラクタ説明デフォルトの乱数アルゴリズムを実装する、セキュリティ保護された乱数ジェネレータ(RNG)を構築します。SecureRandom(byte[] seed) デフォルトの乱数アルゴリズムを実装する、セキュリティ保護された乱数ジェネレータ(RNG)を構築します。protectedSecureRandom(SecureRandomSpi secureRandomSpi, Provider provider) SecureRandomオブジェクトを作成します。 -
メソッドのサマリー
修飾子と型メソッド説明byte[]generateSeed(int numBytes) 指定されたバイト数のシード・バイトを返します。シード・バイトの計算には、このクラスが自身をシードするのに使用するシード生成アルゴリズムが使用されます。このSecureRandomオブジェクトによって実装されたアルゴリズムの名前を返します。static SecureRandomgetInstance(String algorithm) 指定された乱数ジェネレータ(RNG)アルゴリズムを実装するSecureRandomオブジェクトを返します。static SecureRandomgetInstance(String algorithm, String provider) 指定された乱数ジェネレータ(RNG)アルゴリズムを実装するSecureRandomオブジェクトを返します。static SecureRandomgetInstance(String algorithm, Provider provider) 指定された乱数ジェネレータ(RNG)アルゴリズムを実装するSecureRandomオブジェクトを返します。static SecureRandomgetInstance(String algorithm, SecureRandomParameters params) 指定された乱数ジェネレータ(RNG)アルゴリズムを実装し、指定されたSecureRandomParametersリクエストをサポートするSecureRandomオブジェクトを返します。static SecureRandomgetInstance(String algorithm, SecureRandomParameters params, String provider) 指定された乱数ジェネレータ(RNG)アルゴリズムを実装し、指定されたSecureRandomParametersリクエストをサポートするSecureRandomオブジェクトを返します。static SecureRandomgetInstance(String algorithm, SecureRandomParameters params, Provider provider) 指定された乱数ジェネレータ(RNG)アルゴリズムを実装し、指定されたSecureRandomParametersリクエストをサポートするSecureRandomオブジェクトを返します。static SecureRandomsecurerandom.strongAlgorithmsSecurityプロパティで指定されたアルゴリズムまたはプロバイダを使用して選択されたSecureRandomオブジェクトを返します。このSecureRandomインスタンスの実効SecureRandomParametersを返します。final ProviderこのSecureRandomオブジェクトのプロバイダを返します。static byte[]getSeed(int numBytes) 指定されたバイト数のシード・バイトを返します。シード・バイトの計算には、このクラスが自身をシードするのに使用するシード生成アルゴリズムが使用されます。protected final intnext(int numBits) ユーザーが指定した数の擬似乱数ビット(右詰、ゼロ埋め込み)を含む整数を生成します。voidnextBytes(byte[] bytes) ユーザーが指定したバイト数の乱数バイト数を生成します。voidnextBytes(byte[] bytes, SecureRandomParameters params) 追加のパラメータを使用して、ユーザーが指定した数のランダムなバイトを生成します。voidreseed()エントロピ入力からエントロピ入力を読み取ってこのSecureRandomを再計算します。voidreseed(SecureRandomParameters params) このSecureRandomをエントロピ入力から追加パラメータで読み取って再計算します。voidsetSeed(byte[] seed) このランダム・オブジェクトを指定されたシードで再割り当てします。voidsetSeed(long seed) 指定されたlong seedに含まれている8バイトを使用して、この乱数オブジェクトを再シードします。toString()このSecureRandomの人間が読める文字列表現を返します。クラス java.util.Randomで宣言されたメソッド
doubles, doubles, doubles, doubles, from, ints, ints, ints, ints, longs, longs, longs, longs, nextBoolean, nextDouble, nextFloat, nextGaussian, nextInt, nextInt, nextLongクラス java.lang.Objectで宣言されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitインタフェースjava.util.random.RandomGeneratorで宣言されたメソッド
isDeprecated, nextDouble, nextDouble, nextExponential, nextFloat, nextFloat, nextGaussian, nextInt, nextLong, nextLong
-
コンストラクタの詳細
-
SecureRandom
public SecureRandom()デフォルトの乱数アルゴリズムを実装する、セキュリティ保護された乱数ジェネレータ(RNG)を構築します。このコンストラクタは、最優先のProviderから順に、登録済みのセキュリティProviderのリストをトラバースします。
SecureRandom(RNG)アルゴリズムをサポートする最初のプロバイダからSecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。 どのプロバイダもRNGアルゴリズムをサポートしていない場合は、実装固有のデフォルトが返されます。登録済みプロバイダのリストは、
Security.getProviders()メソッド経由で取得できます。標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」の
SecureRandomセクションを参照してください。 -
SecureRandom
public SecureRandom(byte[] seed) デフォルトの乱数アルゴリズムを実装する、セキュリティ保護された乱数ジェネレータ(RNG)を構築します。SecureRandomインスタンスには、指定されたシード・バイトが設定されます。このコンストラクタは、最優先のProviderから順に、登録済みのセキュリティProviderのリストをトラバースします。
SecureRandom(RNG)アルゴリズムをサポートする最初のプロバイダからSecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。 どのプロバイダもRNGアルゴリズムをサポートしていない場合は、実装固有のデフォルトが返されます。登録済みプロバイダのリストは、
Security.getProviders()メソッド経由で取得できます。標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」の
SecureRandomセクションを参照してください。- パラメータ:
seed- シード。
-
SecureRandom
protected SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider) SecureRandomオブジェクトを作成します。- パラメータ:
secureRandomSpi-SecureRandom実装。provider- プロバイダ
-
-
メソッドの詳細
-
getInstance
public static SecureRandom getInstance(String algorithm) throws NoSuchAlgorithmException 指定された乱数ジェネレータ(RNG)アルゴリズムを実装するSecureRandomオブジェクトを返します。このメソッドは、最優先のProviderから順に、登録済みのセキュリティProviderのリストをトラバースします。 指定されたアルゴリズムをサポートする最初のプロバイダから
SecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。登録済みプロバイダのリストは、
Security.getProviders()メソッド経由で取得できます。- 実装上のノート:
- JDKリファレンス実装では、
jdk.security.provider.preferredSecurityプロパティを使用して、指定されたアルゴリズムの優先プロバイダの順序を決定します。 これは、Security.getProviders()によって返されるプロバイダの順序とは異なる場合があります。 - パラメータ:
algorithm- RNGアルゴリズムの名前。 標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」のSecureRandomセクションを参照してください。- 戻り値:
- 新しい
SecureRandomオブジェクト - 例外:
NoSuchAlgorithmException-Providerが、指定されたアルゴリズムのSecureRandomSpi実装をサポートしていない場合NullPointerException-algorithmがnullである場合- 導入されたバージョン:
- 1.2
- 関連項目:
-
getInstance
public static SecureRandom getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException 指定された乱数ジェネレータ(RNG)アルゴリズムを実装するSecureRandomオブジェクトを返します。指定されたプロバイダからの
SecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。 指定したプロバイダは、セキュリティ・プロバイダ・リストに登録する必要があります。登録済みプロバイダのリストは、
Security.getProviders()メソッド経由で取得できます。- パラメータ:
algorithm- RNGアルゴリズムの名前。 標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」のSecureRandomセクションを参照してください。provider- プロバイダ名。- 戻り値:
- 新しい
SecureRandomオブジェクト - 例外:
IllegalArgumentException- プロバイダ名がnullまたは空の場合NoSuchAlgorithmException- 指定されたアルゴリズムのSecureRandomSpi実装が、指定されたプロバイダから利用可能でない場合NoSuchProviderException- 指定されたプロバイダがセキュリティ・プロバイダ・リストに登録されていない場合NullPointerException-algorithmがnullである場合- 導入されたバージョン:
- 1.2
- 関連項目:
-
getInstance
public static SecureRandom getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException 指定された乱数ジェネレータ(RNG)アルゴリズムを実装するSecureRandomオブジェクトを返します。指定されたプロバイダからの
SecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。 指定されたプロバイダをプロバイダ・リストに登録する必要はありません。- パラメータ:
algorithm- RNGアルゴリズムの名前。 標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」のSecureRandomセクションを参照してください。provider- プロバイダ- 戻り値:
- 新しい
SecureRandomオブジェクト - 例外:
IllegalArgumentException- 指定されたプロバイダがnullの場合NoSuchAlgorithmException- 指定されたアルゴリズムのSecureRandomSpi実装が、指定されたProviderオブジェクトから使用できない場合NullPointerException-algorithmがnullである場合- 導入されたバージョン:
- 1.4
- 関連項目:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params) throws NoSuchAlgorithmException 指定された乱数ジェネレータ(RNG)アルゴリズムを実装し、指定されたSecureRandomParametersリクエストをサポートするSecureRandomオブジェクトを返します。このメソッドは、最も優先されるプロバイダから始まる登録済セキュリティ・プロバイダのリストを横断します。 指定されたアルゴリズムをサポートし、指定された
SecureRandomParametersをサポートする最初のプロバイダからSecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。登録済みプロバイダのリストは、
Security.getProviders()メソッド経由で取得できます。- 実装上のノート:
- JDKリファレンス実装では、
jdk.security.provider.preferredプロパティを使用して、指定されたアルゴリズムの優先プロバイダの順序を決定します。 これは、Security.getProviders()によって返されるプロバイダの順序とは異なる場合があります。 - パラメータ:
algorithm- RNGアルゴリズムの名前。 標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」のSecureRandomセクションを参照してください。params- 新しく作成されたSecureRandomオブジェクトがサポートする必要があるSecureRandomParameters。- 戻り値:
- 新しい
SecureRandomオブジェクト - 例外:
IllegalArgumentException- 指定されたパラメータがnullの場合NoSuchAlgorithmException- 指定されたアルゴリズムとパラメータに対してSecureRandomSpi実装をサポートするプロバイダがない場合NullPointerException-algorithmがnullである場合- 導入されたバージョン:
- 9
- 関連項目:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params, String provider) throws NoSuchAlgorithmException, NoSuchProviderException 指定された乱数ジェネレータ(RNG)アルゴリズムを実装し、指定されたSecureRandomParametersリクエストをサポートするSecureRandomオブジェクトを返します。指定されたプロバイダからの
SecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。 指定したプロバイダは、セキュリティ・プロバイダ・リストに登録する必要があります。登録済みプロバイダのリストは、
Security.getProviders()メソッド経由で取得できます。- パラメータ:
algorithm- RNGアルゴリズムの名前。 標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」のSecureRandomセクションを参照してください。params- 新しく作成されたSecureRandomオブジェクトがサポートする必要があるSecureRandomParameters。provider- プロバイダ名。- 戻り値:
- 新しい
SecureRandomオブジェクト - 例外:
IllegalArgumentException- プロバイダ名がnullまたは空の場合、またはparamsがnullの場合NoSuchAlgorithmException- 指定されたプロバイダが、指定されたアルゴリズムおよびパラメータのSecureRandomSpi実装をサポートしていない場合NoSuchProviderException- 指定されたプロバイダがセキュリティ・プロバイダ・リストに登録されていない場合NullPointerException-algorithmがnullである場合- 導入されたバージョン:
- 9
- 関連項目:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params, Provider provider) throws NoSuchAlgorithmException 指定された乱数ジェネレータ(RNG)アルゴリズムを実装し、指定されたSecureRandomParametersリクエストをサポートするSecureRandomオブジェクトを返します。指定されたプロバイダからの
SecureRandomSpi実装をカプセル化する新しいSecureRandomオブジェクトが返されます。 指定されたプロバイダをプロバイダ・リストに登録する必要はありません。- パラメータ:
algorithm- RNGアルゴリズムの名前。 標準のRNGアルゴリズム名については、「Javaセキュリティ標準アルゴリズム名指定」のSecureRandomセクションを参照してください。params- 新しく作成されたSecureRandomオブジェクトがサポートする必要があるSecureRandomParameters。provider- プロバイダ- 戻り値:
- 新しい
SecureRandomオブジェクト - 例外:
IllegalArgumentException- 指定されたプロバイダまたはパラメータがnullの場合NoSuchAlgorithmException- 指定されたプロバイダが、指定されたアルゴリズムおよびパラメータのSecureRandomSpi実装をサポートしていない場合NullPointerException-algorithmがnullである場合- 導入されたバージョン:
- 9
- 関連項目:
-
getProvider
public final Provider getProvider()このSecureRandomオブジェクトのプロバイダを返します。- 戻り値:
- この
SecureRandomオブジェクトのプロバイダ。
-
getAlgorithm
public String getAlgorithm()このSecureRandomオブジェクトによって実装されたアルゴリズムの名前を返します。- 戻り値:
- アルゴリズムの名前。アルゴリズム名を特定できない場合は
unknown。 - 導入されたバージョン:
- 1.5
-
toString
public String toString()このSecureRandomの人間が読める文字列表現を返します。 -
getParameters
public SecureRandomParameters getParameters()このSecureRandomインスタンスの実効SecureRandomParametersを返します。戻り値は、
getInstanceメソッドに渡されたSecureRandomParametersオブジェクトとは異なる場合がありますが、このSecureRandomオブジェクトの存続期間中は変更できません。呼び出し元は、返された値を使用して、この
SecureRandomがサポートする機能を調べることができます。- 戻り値:
- 有効な
SecureRandomParametersパラメータ、またはパラメータが使用されていない場合はnull。 - 導入されたバージョン:
- 9
- 関連項目:
-
setSeed
public void setSeed(byte[] seed) このランダム・オブジェクトを指定されたシードで再割り当てします。 種子は、既存の種子を置き換えるのではなく、補充します。 これにより、呼出しを繰り返しても、ランダム性が減少しないことが保証されます。PRNG
SecureRandomは、nextBytesまたはreseedが呼び出される前にsetSeedが呼び出されると自動的にシードされません。 呼び出し側は、seed引数に、このSecureRandomのセキュリティのための十分なエントロピが含まれていることを確認する必要があります。- パラメータ:
seed- シード。- 関連項目:
-
setSeed
public void setSeed(long seed) 指定されたlong seedに含まれている8バイトを使用して、この乱数オブジェクトを再シードします。 与えられたシードは、既存のシードと置き換わるのではなく、既存のシードに追加されます。 これにより、呼出しを繰り返しても、ランダム性が減少しないことが保証されます。PRNG
SecureRandomは、nextBytesまたはreseedが呼び出される前にsetSeedが呼び出されると自動的にシードされません。 呼び出し側は、seed引数に、このSecureRandomのセキュリティのための十分なエントロピが含まれていることを確認する必要があります。このメソッドは、
java.util.Randomとの互換性のために定義されています。 -
nextBytes
public void nextBytes(byte[] bytes) ユーザーが指定したバイト数の乱数バイト数を生成します。- 定義:
- インタフェース
RandomGenerator内のnextBytes - オーバーライド:
nextBytes、クラスRandom- パラメータ:
bytes- 乱数バイトを充填する配列。
-
nextBytes
public void nextBytes(byte[] bytes, SecureRandomParameters params) 追加のパラメータを使用して、ユーザーが指定した数のランダムなバイトを生成します。- パラメータ:
bytes- 乱数バイトを充填する配列params- 追加パラメータ- 例外:
NullPointerException-bytesがnullの場合UnsupportedOperationException- 基本のプロバイダ実装がこのメソッドをオーバーライドしていない場合IllegalArgumentException-paramsがnullの場合、このSecureRandomによって不正またはサポートされていない- 導入されたバージョン:
- 9
-
next
protected final int next(int numBits) ユーザーが指定した数の擬似乱数ビット(右詰、ゼロ埋め込み)を含む整数を生成します。 このメソッドはjava.util.Randomメソッドをオーバーライドし、そのクラス(例:nextInt、nextLongおよびnextFloat)から継承されたすべてのメソッドにランダム・ビットのソースを提供します。 -
getSeed
public static byte[] getSeed(int numBytes) 指定されたバイト数のシード・バイトを返します。シード・バイトの計算には、このクラスが自身をシードするのに使用するシード生成アルゴリズムが使用されます。 この呼出しを使うと、ほかの乱数ジェネレータをシードできます。このメソッドは、下位互換のためだけに提供されています。 呼び出し元は、
SecureRandomオブジェクトを取得するために、別のgetInstanceメソッドの1つを使用し、generateSeedメソッドを呼び出して、そのオブジェクトからシード・バイトを取得することをお勧めします。- パラメータ:
numBytes- 生成するシード・バイト数。- 戻り値:
- シード・バイト。
- 例外:
IllegalArgumentException-numBytesが負の場合- 関連項目:
-
generateSeed
public byte[] generateSeed(int numBytes) 指定されたバイト数のシード・バイトを返します。シード・バイトの計算には、このクラスが自身をシードするのに使用するシード生成アルゴリズムが使用されます。 この呼出しを使うと、ほかの乱数ジェネレータをシードできます。- パラメータ:
numBytes- 生成するシード・バイト数。- 戻り値:
- シード・バイト。
- 例外:
IllegalArgumentException-numBytesが負の場合
-
getInstanceStrong
public static SecureRandom getInstanceStrong() throws NoSuchAlgorithmExceptionsecurerandom.strongAlgorithmsSecurityプロパティで指定されたアルゴリズムまたはプロバイダを使用して選択されたSecureRandomオブジェクトを返します。RSA公開/非公開キーのような付加価値の高い永続的な秘密情報を作成する場合など、状況によっては強力な乱数値が必要になります。 アプリケーションが適切で強力な
SecureRandom実装を選択できるようにするため、Javaディストリビューションでは、securerandom.strongAlgorithmsセキュリティ・プロパティに既知の強力なSecureRandom実装のリストが含まれています。Javaプラットフォームのすべての実装は、強力な
SecureRandom実装を1つ以上サポートする必要があります。- 戻り値:
securerandom.strongAlgorithmsセキュリティ・プロパティで示される強力なSecureRandom実装- 例外:
NoSuchAlgorithmException- アルゴリズムが存在しない場合- 導入されたバージョン:
- 1.8
- 関連項目:
-
reseed
public void reseed()エントロピ入力からエントロピ入力を読み取ってこのSecureRandomを再計算します。- 例外:
UnsupportedOperationException- 基本となるプロバイダ実装がこのメソッドをオーバーライドしていない場合。- 導入されたバージョン:
- 9
-
reseed
public void reseed(SecureRandomParameters params) このSecureRandomをエントロピ入力から追加パラメータで読み取って再計算します。エントロピはエントロピ源から得られることに留意されたい。
paramsの一部のデータにはエントロピが含まれることがありますが、主な用途は多様性を提供することです。- パラメータ:
params- 余分なパラメータ- 例外:
UnsupportedOperationException- 基本となるプロバイダ実装がこのメソッドをオーバーライドしていない場合。IllegalArgumentException-paramsがnullの場合、このSecureRandomによって不正またはサポートされていない- 導入されたバージョン:
- 9
-