Вы можете преобразовать SecretKey
его в байтовый массив ( byte[]
), а затем кодировать Base64 в String
. Чтобы преобразовать обратно в a SecretKey
, Base64 декодирует строку и использует ее в a SecretKeySpec
для восстановления исходного кода SecretKey
.
Для Java 8
Секретный ключ к строке:
// create new key
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// get base64 encoded version of the key
String encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
Строка для 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");
Для Java 7 и более ранних версий (включая Android):
ПРИМЕЧАНИЕ I: вы можете пропустить часть кодирования / декодирования Base64 и просто сохранить byte[]
в SQLite. Тем не менее, выполнение кодирования / декодирования Base64 не является дорогой операцией, и вы можете без проблем хранить строки практически в любой БД.
ПРИМЕЧАНИЕ II. Более ранние версии Java не включают Base64 в один из пакетов java.lang
или java.util
. Однако можно использовать кодеки из Apache Commons Codec , Bouncy Castle или Guava .
Секретный ключ к строке:
// 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)}
Строка для 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
Java нет явного метода уничтожения экземпляров, в то время как ключевые объекты и байтовые массивы могут быть очищены. Это означает, что ключи могут оставаться доступными в памяти в течение более длительного периода времени.KeyStore
Предпочтительно использовать (защищенный паролем) , предпочтительно поддерживаемый системой / ОС среды выполнения или даже оборудованием.