Простой способ хранить/восстанавливать ключ шифрования для дешифрования строки в Java

Для шифрования я использую что-то вроде этого:

SecretKey aesKey = KeyGenerator.getInstance("AES").generateKey();
StringEncrypter aesEncrypt = new StringEncrypter(aesKey, aesKey.getAlgorithm());
String aesEncrypted= aesEncrypt.encrypt(StringContent);

Если я распечатываю aesKey, я добираюсь: "javax.crypto.spec.SecretKeySpec@1708d".

Таким образом для шифрования я хотел бы попросить у пользователя ключа, но не знаю то, как и чем формат должен это быть. Мой план был чем-то вроде этого:

SecretKey aesKey = javax.crypto.spec.SecretKeySpec@1708d;
StringEncrypter aesEncrypt = new StringEncrypter(aesKey, aesKey.getAlgorithm());
String aesDecrypt = aesEncrypt.decrypt(aesEncrypted);

Но кажется не работа. Там некоторый простой способ состоит в том, чтобы распечатать ключ после шифрования к консоли, таким образом, пользователь может сохранить его (или помнить его), и затем Использование для Дешифрования?

Целый код является here:Cannot, дешифруют шифрованный текст от текстового файла, реализации симметричного ключа. в Java, Таким образом, я сожалею о регистрации снова, но я не уверен, Читаем ли код даже (я - новичок).

15
задан Community 23 May 2017 в 12:00
поделиться

3 ответа

Я сохранил ключи в файлах хранилища ключей Java. Вот статья, которая может вам помочь

http://www.informit.com/articles/article.aspx?p=170967&seqNum=3

4
ответ дан 1 December 2019 в 00:59
поделиться

Для справки: вывод, который вы видите, является результатом метода toString по умолчанию, а забавное число в конце - это хэш-код. См. здесь . Хэш-коды по своей конструкции необратимы, и toString не обязательно дает вам достаточно информации для восстановления исходного объекта (хотя это и происходит для некоторых классов).

0
ответ дан 1 December 2019 в 00:59
поделиться

Большинство экземпляров Java Key представлены в виде строки байтов, полученных в результате их метода getEncoded () . Это то, что необходимо сохранить, чтобы позже восстановить ключ.

Однако для безопасного хранения ключа в электронной форме он должен быть зашифрован. Конечно, для шифрования ключа потребуется другой ключ (или пароль)… и, таким образом, вы получите бесконечный регресс. Java KeyStore может использоваться для хранения объектов SecretKey таким образом, и это полезно, когда у вас есть много секретных ключей, которые все защищены одним «главным» паролем. Но для защиты одного ключа это не имеет большого смысла.

Одна альтернатива - представить ключ пользователю в форме, которая может храниться безопасным способом (во многих приложениях, это могло быть на бумажке в их бумажнике). Это может быть так же просто, как отображение байтов ключа, закодированных в шестнадцатеричной системе, Base-64 или другой текстовой кодировке, и просьба пользователя записать его.

Другой подход - позволить пользователю выбрать запоминающийся пароль, и сгенерируйте ключ с помощью этого алгоритма, такого как PBKDF2. Однако соль (и, возможно, счетчик итераций), использованная для вывода ключа, должна быть где-то записана. Другой недостаток заключается в том, что люди склонны выбирать из относительно ограниченного числа паролей из общего числа доступных. Таким образом, ключи, полученные из паролей, может быть легче угадать, чем предполагает размер ключа.


Вот иллюстрация основного метода сохранения и восстановления секретного ключа.

byte[] encoded = aesKey.getEncoded();
/* Now store "encoded" somewhere. For example, display the key and 
   ask the user to write it down. */
String output = Base64.getEncoder().withoutPadding().encodeToString(encoded);
System.out.println("Keep it secret, keep it safe! " + output);

...

/* At some point, you need to reconstitute the key. Let's say the user 
   enters it as a base-64 number that you convert to bytes. */
String input = ... ;
byte[] encoded = Base64.getDecoder().decode(input);
SecretKey aesKey = new SecretKeySpec(encoded, "AES");
14
ответ дан 1 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: