こんにちは、Habr! Javaの暗号化の基礎を学びたい初心者向けの一連の記事の Jakob Jenkovによる「Java KeyStore」の記事9の翻訳を紹介します。
目次:
- Java暗号化
- Java暗号
- メッセージダイジェスト
- Mac
- 署名
- キーペア
- キージェネレーター
- KeyPairGenerator
- キーストア
- キーツール
- 証明書
- CertificateFactory
- 証明書パス
キーストア
Java KeyStoreは、KeyStoreクラス( java.security.KeyStore )によって提供されるデータベースタイプのキーストアです。 ストレージはディスクに書き込んで再度読み取ることができ、パスワードで保護することができます。また、キーストア内の各キーレコードは独自のパスワードで保護できます。 キーストアには、次のタイプのキーを含めることができます。
- 秘密鍵
- 公開鍵と証明書(公開鍵+証明書)
- 秘密鍵
秘密鍵と公開鍵は、非対称暗号化で使用されます。 公開鍵には証明書が関連付けられている場合があります。 証明書は、公開鍵を所有していると主張する個人、組織、またはデバイスの身元を証明する文書です。 証明書は通常、証明書として証明書利用者によってデジタル署名されます。 秘密鍵は対称暗号化で使用されます。 ほとんどの場合、安全な接続を設定する場合、対称キーは非対称キーよりも劣るため、ほとんどの場合、公開キーと秘密キーをキーストアに保存します。
キーストアの作成
getInstance()
メソッドを呼び出すことにより、 KeyStore
インスタンスを作成できます。 クラスのインスタンスを作成する例を次に示します。
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
この例では、デフォルトのKeyStore
インスタンスを作成します。 パラメータをgetInstance()
メソッドに渡すことにより、異なるキーストレージ形式でKeyStoreインスタンスを作成することもできます。 たとえば、 PKCS12
キーストアのインスタンスを作成するには:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
キーストアをダウンロードする
キーストアのインスタンスを使用する前に、ダウンロードする必要があります。 KeyStore
クラスは、使用する前にデータを読み取る必要があると想定しているため、 KeyStore
クラスのインスタンスは、後で使用するためにディスクまたはその他のストレージに書き込まれることKeyStore
よくあります。 ただし、後で見るように、データなしで空のKeyStore
インスタンスを初期化できます。
データは、次の2つのパラメーターをとるload()
メソッドを呼び出すことにより、ファイルまたはその他のストレージからロードされます。
- データのロード元の
InputStream
。 -
char[]
キーストアからのパスワードを含む文字の配列。
キーストアをロードする例を次に示します。
char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); }
この例では、keystore.ksキーストアファイルをロードします。 キーストアにデータをロードしたくない場合は、 InputStream
パラメーターにnull
を渡します。 これは、空のキーストアのロード方法です。
keyStore3.load(null, keyStorePassword);
KeyStore
クラスのインスタンスには、常にdataまたはnull
ロードするKeyStore
がありnull
。 そうでない場合、キーストアは初期化されず、そのメソッドへのすべての呼び出しは例外をスローします。
鍵を受け取る
getEntry()
メソッドを使用して、 KeyStore
クラスのインスタンスのキーを取得できます。 キーストアレコードは、キーを識別するエイリアスにマップされ、パスワードで保護されています。 したがって、キーにアクセスするには、キーエイリアスとパスワードをgetEntry()
メソッドに渡す必要があります。 KeyStore
インスタンスへの書き込みアクセスの例を次に示します。
char[] keyPassword = "789xyz".toCharArray(); KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword); KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword);
アクセスするレコードが秘密キーであることがわかっている場合は、 KeyStore.Entry
のインスタンスをKeyStore.Entry
に変換できます。 これは次のようなものです。
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore3.getEntry("keyAlias", entryPassword);
KeyStore.PrivateKeyEntry
キャストした後、次の方法を使用して秘密鍵、証明書、および証明書チェーンにアクセスできます。
-
getPrivateKey()
-
getCertificate()
-
getCertificateChain()
キーストレージ
KeyStore
クラスのインスタンスにキーを配置することもできます。 KeyStore
インスタンスに秘密鍵(対称鍵)を配置する例:
SecretKey secretKey = getSecretKey(); KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword);
保管
キーストアをある種のストレージ(ディスク、データベースなど)に保存して、もう一度ロードできるようにする場合があります。 KeyStore
クラスのインスタンスは、 store()
メソッドを呼び出すことKeyStore
保存されます。 例:
char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); }