Você pode converter o SecretKeyem 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 SecretKeySpecpara 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.langou 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");
Stringinstâ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.