Java – Como Armazenar as Chaves de uma Criptografia Assimétrica

by Andres Amador / from beautifuldecay.com

Salvar chaves públicas e privadas é tão simples quanto criá-las no Java, apesar de não ser tão intuitivo e quase impossível descobrir como apenas lendo o nome dos métodos. Com algumas pequenas pesquisas descobri que o método getEncoded() existente tanto na classe PrivateKey quanto na classe PublicKey retorna um vetor de bytes contendo verdadeiramente a chave. Tendo esse vetor de bytes, podemos salvá-los onde desejarmos para depois recuperar como mostram as linhas de código abaixo:


byte[] privateKeyBytes = privateKey.getEncoded();
byte[] publicKeyBytes = publicKey.getEncoded();
// … salve os bytes em um arquivo ou banco de dados…

Ok, salvei os bytes e recuperei em um outro momento em meu código, mas como transformar esses bytes de novo em PrivateKey e PublicKey, ou como criar instâncias dessas classes com esses bytes que estou recuperando? Primeiramente é preciso saber que as chaves privadas são “encoded” no formato PKCS8, enquanto o chaves públicas sofrem esse processo no formado X509. Depois de ter isso em mente, é preciso ter conhecimento que existe no Java um singleton chamado KeyFactory que é capaz de gerar as chaves públicas e privadas se fornecermos uma instância de EncodedKeySpec a ele referente a nossa chave. Temos que criar então uma instância de EncodedKeySpec informando os bytes de nossa chave privada e uma outra instância dessa mesma classe para nossa chave pública, porém informando os bytes de nossa chave pública.

Lembra do que primeiramente temos que ter em mente? Sim, os formatos. É aqui que eles vão fazer a real diferença no procedimento. Cada nossa instância de EncodedKeySpec deve estar relacionado a esse formado e por isso essa classe possui duas classes filhas PKCS8EncodedKeySpec e X509EncodedKeySpec. O resto fica muito óbvio, passaremos os bytes de nossa chave privada para a instância de PKCS8EncodedKeySpec e os bytes de nossa chave pública nós passaremos para nossa instância de X509EncodedKeySpec. Tendo todo esse procedimento em mente, fica fácil entender o código baixo:


// Convertendo os bytes salvos em instâncias
byte[] privateKeyBytes = privateKey.getEncoded();
byte[] publicKeyBytes = publicKey.getEncoded();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);

3 comentários em “Java – Como Armazenar as Chaves de uma Criptografia Assimétrica

    1. Fico muito feliz, Matheus! Gosto muito de saber que estou ajudando de alguma forma, porque sei o quanto sofremos para encontrar certas informações!

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s