Javaでの暗号化。 キーストアクラス

こんにちは、Habr! Javaの暗号化の基礎を学びたい初心者向けの一連の記事の Jakob Jenkovによる「Java KeyStore」の記事9の翻訳を紹介します。







目次:



  1. Java暗号化
  2. Java暗号
  3. メッセージダイジェスト
  4. Mac
  5. 署名
  6. キーペア
  7. キージェネレーター
  8. KeyPairGenerator
  9. キーストア
  10. キーツール
  11. 証明書
  12. CertificateFactory
  13. 証明書パス


キーストア



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()



メソッドを呼び出すことにより、ファイルまたはその他のストレージからロードされます。









キーストアをロードする例を次に示します。







 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



キャストした後、次の方法を使用して秘密鍵、証明書、および証明書チェーンにアクセスできます。









キーストレージ



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






All Articles