Puoi convertire il SecretKey
in un array di byte ( byte[]
), quindi codificarlo in Base64 in un file String
. Per riconvertire in a SecretKey
, Base64 decodifica la stringa e usala in a SecretKeySpec
per ricostruire l'originale SecretKey
.
Per Java 8
SecretKey alla stringa:
// create new key
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// get base64 encoded version of the key
String encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
String to 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");
Per Java 7 e versioni precedenti (incluso Android):
NOTA I: puoi saltare la parte di codifica / decodifica Base64 e memorizzare semplicemente il file byte[]
in SQLite. Detto questo, eseguire la codifica / decodifica Base64 non è un'operazione costosa e puoi memorizzare le stringhe in quasi tutti i DB senza problemi.
NOTA II: le versioni precedenti di Java non includono un Base64 in uno dei pacchetti java.lang
o java.util
. È comunque possibile utilizzare codec da Apache Commons Codec , Bouncy Castle o Guava .
SecretKey alla stringa:
// 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 to 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
istanze in Java mentre gli oggetti chiave e gli array di byte possono essere cancellati. Ciò significa che le chiavi potrebbero rimanere disponibili nella memoria per un periodo di tempo più lungo. L'uso di un (protetto da password)KeyStore
, preferibilmente uno supportato dal sistema di runtime / OS o anche dall'hardware dovrebbe essere preferito.