Criptografia Java - armazenamento de chaves

As chaves e certificados usados ​​/ gerados são armazenados em um banco de dados denominado keystore. Por padrão, este banco de dados é armazenado em um arquivo chamado.keystore.

Você pode acessar o conteúdo deste banco de dados usando o KeyStore classe do java.securitypacote. Isso gerencia três entradas diferentes, a saber, PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Armazenando uma chave no keystore

Nesta seção, aprenderemos como armazenar uma chave em um armazenamento de chaves. Para armazenar uma chave no armazenamento de chaves, siga as etapas fornecidas abaixo.

Etapa 1: Criar um objeto KeyStore

o getInstance() método do KeyStore classe do java.security pacote aceita um valor de string que representa o tipo de armazenamento de chaves e retorna um objeto KeyStore.

Crie um objeto da classe KeyStore usando o getInstance() método conforme mostrado abaixo.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

Etapa 2: carregar o objeto KeyStore

o load() O método da classe KeyStore aceita um objeto FileInputStream que representa o arquivo keystore e um parâmetro String que especifica a senha do KeyStore.

Em geral, o KeyStore é armazenado no arquivo denominado cacerts, no local C:/Program Files/Java/jre1.8.0_101/lib/security/ e sua senha padrão é changeit, carregue-o usando o load() método conforme mostrado abaixo.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

Etapa 3: Crie o objeto KeyStore.ProtectionParameter

Instancie o KeyStore.ProtectionParameter conforme mostrado abaixo.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Etapa 4: crie um objeto SecretKey

Crie o SecretKey (interface) objeto instanciando sua Subclasse SecretKeySpec. Durante a instanciação, você precisa passar a senha e o algoritmo como parâmetros para seu construtor, conforme mostrado abaixo.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Etapa 5: crie um objeto SecretKeyEntry

Crie um objeto do SecretKeyEntry classe passando no SecretKey objeto criado na etapa acima, conforme mostrado abaixo.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

Etapa 6: definir uma entrada para o KeyStore

o setEntry() método do KeyStore classe aceita um parâmetro String que representa o alias de entrada do keystore, um SecretKeyEntry objeto, um objeto ProtectionParameter e, armazena a entrada no alias fornecido.

Defina a entrada para o armazenamento de chaves usando o setEntry() método conforme mostrado abaixo.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Example

O exemplo a seguir armazena as chaves no armazenamento de chaves existente no arquivo “cacerts” (sistema operacional Windows 10).

import java.io.FileInputStream;
import java.security.KeyStore;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class StoringIntoKeyStore{
   public static void main(String args[]) throws Exception {
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the KeyStore object
      char[] password = "changeit".toCharArray();
      String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
      java.io.FileInputStream fis = new FileInputStream(path);
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      System.out.println("data stored");
   }
}

Output

O programa acima gera a seguinte saída -

System.out.println("data stored");