Кэшируйте содержимое KeyStore и конвертируйте его в InputStream - PullRequest
2 голосов
/ 18 августа 2010

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

API предлагает следующее для загрузки ключа из хранилища ключей

keyStore.load(inputStream, keyStorePassword.toCharArray()); 

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

Не могли бы вы помочь мне со стратегией хранения его в памяти и отзатем при доступе к нему и преобразовании в InputStream?

Примечание: я попытался прочитать содержимое хранилища ключей в строку (UTF-8), преобразовать его в InputStream и передать его вAPI. Но он выплевывает следующее исключение

java.io.IOException: Неверная форма хранилища ключей

Ответы [ 2 ]

3 голосов
/ 18 августа 2010

Магазин ключей находится в каком-то двоичном формате. Преобразование его в строку UTF-8 не годится. Вы можете использовать ByteArrayInputStream, который использует байтовый буфер.

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

Также: есть причина, по которой пароли обычно предоставляются через массивы char: вы имеете полный контроль над содержимым массива и можете очистить его, когда он больше не нужен. Пароль должен оставаться в памяти как можно короче. У вас нет такого управления простыми строками (вы не знаете, когда они будут собирать мусор).

0 голосов
/ 18 августа 2010

Спасибо за ответы.Я все за альтернативу ниже.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...