2013-07-25 2 views
0
KeyStore ks = KeyStore.getInstance("JCEKS"); 
ks.load(null, null); 
SecretKey skInput = new SecretKeySpec("input".getBytes(), "DESede"); 
SecretKeyEntry skeInput = new KeyStore.SecretKeyEntry(skInput); 
ks.setEntry("input_key", skeInput, new KeyStore.PasswordProtection("banana".toCharArray())); 
FileOutputStream fos = new FileOutputStream("my.keystore"); 
pambks.store(fos, "password".toCharArray()); 
fos.flush(); 
fos.close(); 

Код, показанный выше, пытается кодировать input в SecretKey и хранить его в хранилище ключей. Код, показанный ниже, - это то, как я извлекаю ключ из хранилища ключей. Но я не знаю, как его декодировать до первоначальной ценности?Как кодировать и декодировать SecretKey в JAVA?

FileInputStream fin = new FileInputStream("my.keystore"); 
KeyStore ks = KeyStore.getInstance("JCEKS"); 
ks.load(fin, "password".toCharArray()); 
SecretKeyEntry ske = (SecretKeyEntry) readks.getEntry("input_key", new KeyStore.PasswordProtection("banana".toCharArray())); 
SecretKey sk = ske.getSecretKey(); 

Я не был уверен, что это правильный ли способ сделать шифрование и дешифрование для SecretKey, пожалуйста, поправьте меня, если я ошибаюсь.

ответ

1

Чтение этого вопроса/ответа Я думаю, что я неправильно понял вопрос.

Вы можете получить представление байта ключа назад, вызвав метод getEncoded на ваш ключ. После этого можно использовать один из конструкторов String, чтобы вернуть его обратно в текст. Как сказано, вы не должны использовать строку как ключ. Обратите внимание, что ключи DES содержат четность в последнем бите, поэтому это может изменить результат. Чтобы использовать строки для ключей, более целесообразно использовать hexadecimals. Обратите внимание, что ключи должны иметь достаточную энтропию, и строка, вероятно, не даст этого.


Есть несколько вещей, не совсем правильно в коде выше:

  1. Вы не должны (никогда) использовать "input".getBytes(). Прежде всего, getBytes() использует стандартную кодировку символов по умолчанию. Если вы хотите использовать DES-ключ как String, декодируйте его с помощью декодера шестнадцатеричных (например, в коде Apache Commons или Bouncy Castle).

  2. Вы должны использовать 24 байта для ключей DESede. "input".getBytes() не возвращает достаточно байтов.

  3. Для ключей DES платит, чтобы ввести спецификацию ключа через KeyFactory, если только для того, чтобы установить биты четности. Они будут уверены, что ключ действителен.

Чтобы получить хорошее количество ключевых данных, используйте PBKDF2 для паролей или используйте случайно сгенерированные ключи.

Если в зашифрованном хранилище ключей достаточно места для хранения зашифрованного ключа, зависит от варианта использования и других мер безопасности.

Смежные вопросы