Puede convertir el SecretKey
en una matriz de bytes ( byte[]
), luego en Base64 codificarlo en un String
. Para volver a convertir a a SecretKey
, Base64 decodifica la cadena y úsala en a SecretKeySpec
para reconstruir tu original SecretKey
.
Para Java 8
Clave secreta a cadena:
// create new key
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// get base64 encoded version of the key
String encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
Cadena a 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 y versiones anteriores (incluido Android):
NOTA I: puede omitir la parte de codificación / decodificación Base64 y simplemente almacenar el byte[]
archivo en SQLite. Dicho esto, realizar la codificación / decodificación Base64 no es una operación costosa y puede almacenar cadenas en casi cualquier base de datos sin problemas.
NOTA II: Las versiones anteriores de Java no incluyen Base64 en uno de los paquetes java.lang
o java.util
. Sin embargo, es posible utilizar códecs de Apache Commons Codec , Bouncy Castle o Guava .
Clave secreta a cadena:
// 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)}
Cadena a 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
instancias en Java, mientras que los objetos clave y las matrices de bytes pueden borrarse. Esto significa que las claves podrían permanecer disponibles en la memoria durante un período de tiempo más largo.KeyStore
Se debe preferir el uso de un (protegido por contraseña) , preferiblemente uno respaldado por el sistema de ejecución / SO o incluso el hardware.