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