
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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); |
Muito bom. Obrigado , meu caro
CurtirCurtir
Meu amigo, muuuuuuuuuuuuito obrigado! Você não imagina o quanto eu procurei por esta informação.
CurtirCurtir
Fico muito feliz, Matheus! Gosto muito de saber que estou ajudando de alguma forma, porque sei o quanto sofremos para encontrar certas informações!
CurtirCurtir