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


Source: https://habr.com/ru/post/J445786/


All Articles