Я генерирую ключ, и мне нужно сохранить его в БД, поэтому я конвертирую его в String, но чтобы получить обратно ключ из String. Каковы возможные пути достижения этого?
Мой код,
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
Как я могу вернуть ключ из String?
java
string
encryption
Princeyesuraj
источник
источник
String
Java нет явного метода уничтожения экземпляров, в то время как ключевые объекты и байтовые массивы могут быть очищены. Это означает, что ключи могут оставаться доступными в памяти в течение более длительного периода времени.KeyStore
Предпочтительно использовать (защищенный паролем) , предпочтительно поддерживаемый системой / ОС среды выполнения или даже оборудованием.Ответы:
Вы можете преобразовать
SecretKey
его в байтовый массив (byte[]
), а затем кодировать Base64 вString
. Чтобы преобразовать обратно в aSecretKey
, Base64 декодирует строку и использует ее в aSecretKeySpec
для восстановления исходного кодаSecretKey
.Для Java 8
Секретный ключ к строке:
Строка для SecretKey:
Для Java 7 и более ранних версий (включая Android):
ПРИМЕЧАНИЕ I: вы можете пропустить часть кодирования / декодирования Base64 и просто сохранить
byte[]
в SQLite. Тем не менее, выполнение кодирования / декодирования Base64 не является дорогой операцией, и вы можете без проблем хранить строки практически в любой БД.ПРИМЕЧАНИЕ II. Более ранние версии Java не включают Base64 в один из пакетов
java.lang
илиjava.util
. Однако можно использовать кодеки из Apache Commons Codec , Bouncy Castle или Guava .Секретный ключ к строке:
Строка для SecretKey:
источник
Чтобы показать, как весело создавать некоторые функции, которые быстро выходят из строя, я написал следующие 3 функции.
Один создает ключ AES, один кодирует его, а другой декодирует обратно. Эти три метода можно использовать с Java 8 (вне зависимости от внутренних классов или внешних зависимостей):
источник
getEncoded()
оно недоступно).На самом деле то, что предложил Луис, меня не устроило. Пришлось придумать другой способ. Вот что мне помогло. Тебе тоже может помочь. Ссылки:
* .getEncoded (): https://docs.oracle.com/javase/7/docs/api/java/security/Key.html
Информация о кодировщике: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html
Информация о декодере: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html
Фрагменты кода: Для кодирования:
Для расшифровки:
источник
Вы не хотите использовать
.toString()
.Обратите внимание, что SecretKey наследуется от java.security.Key, который сам наследуется от Serializable. Таким образом, ключевым моментом здесь (без каламбура) является сериализация ключа в ByteArrayOutputStream, получение массива byte [] и сохранение его в db. Обратный процесс заключался бы в том, чтобы получить массив byte [] из базы данных, создать ByteArrayInputStream из массива byte [] и десериализовать SecretKey с него ...
... или, что еще проще, просто используйте
.getEncoded()
метод, унаследованный от java.security.Key (который является родительским интерфейсом SecretKey). Этот метод возвращает закодированный массив byte [] из Key / SecretKey, который вы можете сохранить или получить из базы данных.Все это при условии, что ваша реализация SecretKey поддерживает кодирование. В противном случае
getEncoded()
вернет null.редактировать:
Вам следует взглянуть на документацию Key / SecretKey javadocs (доступную прямо в начале страницы Google):
http://download.oracle.com/javase/6/docs/api/java/security/Key.html
Или это из CodeRanch (также найдено с помощью того же поиска Google):
http://www.coderanch.com/t/429127/java/java/Convertion-between-SecretKey-String-or
источник
Преобразование SecretKeySpec в String и наоборот: вы можете использовать
getEncoded()
метод, вSecretKeySpec
котором будет даватьbyteArray
, из которого вы можетеencodeToString()
получитьstring
значениеSecretKeySpec
вBase64
объекте.При преобразовании
SecretKeySpec
вString
: usedecode()
inBase64
предоставитbyteArray
, из этого вы можете создать экземпляр дляSecretKeySpec
с параметрами какbyteArray
для воспроизведения вашегоSecretKeySpec
.источник
попробуйте, он работает без Base64 (который включен только в JDK 1.8), этот код работает и в предыдущей версии java :)
источник