Você pode converter o SecretKey
em uma matriz de bytes ( byte[]
) e, em seguida, em Base64 codificá-lo em um String
. Para converter de volta para a SecretKey
, Base64 decodifique a String e use-a SecretKeySpec
para reconstruir o original SecretKey
.
Para Java 8
SecretKey to String:
// create new key
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// get base64 encoded version of the key
String encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
String para SecretKey:
// decode the base64 encoded string
byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
// rebuild key using SecretKeySpec
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
Para Java 7 e anterior (incluindo Android):
NOTA I: você pode pular a parte de codificação / decodificação Base64 e apenas armazená-la byte[]
no SQLite. Dito isso, realizar a codificação / decodificação Base64 não é uma operação cara e você pode armazenar strings em quase qualquer banco de dados sem problemas.
NOTA II: As versões anteriores do Java não incluem um Base64 em um dos pacotes java.lang
ou java.util
. No entanto, é possível usar codecs do Apache Commons Codec , Bouncy Castle ou Guava .
SecretKey to String:
// CREATE NEW KEY
// GET ENCODED VERSION OF KEY (THIS CAN BE STORED IN A DB)
SecretKey secretKey;
String stringKey;
try {secretKey = KeyGenerator.getInstance("AES").generateKey();}
catch (NoSuchAlgorithmException e) {/* LOG YOUR EXCEPTION */}
if (secretKey != null) {stringKey = Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT)}
String para SecretKey:
// DECODE YOUR BASE64 STRING
// REBUILD KEY USING SecretKeySpec
byte[] encodedKey = Base64.decode(stringKey, Base64.DEFAULT);
SecretKey originalKey = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
String
instâncias em Java enquanto objetos-chave e matrizes de bytes podem ser limpos. Isso significa que as chaves podem ficar disponíveis na memória por um longo período de tempo. Usar um (protegido por senha)KeyStore
, preferencialmente um apoiado pelo sistema de tempo de execução / SO ou mesmo hardware deve ser preferido.