2014-02-10 7 views
1

Проблема заключается в следующем: мне нужно убедиться, что после того, как определенное шифрование данных завершено, нет способа извлечь ключ из паролей/производных из памяти приложений (существующие пароли/ключи были отменены). Я знаю, что это непростая задача. Я думаю, что я все еще могу сделать это в основной части приложения, которое я реализую сам.Очистка памяти после шифрования данных с использованием JCA/JCE

Но как насчет вызовов внешних библиотек, подобных тем, которые реализуют JCA/JCE, я не могу делать шифрование без (скажем, Bouncy Castle). Насколько я уверен, что библиотека не создает клоны или другие объекты, о которых я ничего не знаю, это могло бы открыть пароль после того, как кто-то выгрузит память, чтобы проанализировать ее с линии.

Могу я просто сказать библиотеке, чтобы очистить память, которую он использовал? Или, может быть, есть другие способы решения этой проблемы?

+0

Этот тип библиотеки должен использовать 'char []' вместо строк (проверьте его, если у вас есть доступ к исходному коду). Это позволяет очистить его содержимое. Следовательно, вам все равно, останется ли этот символ [char []] в памяти. –

+0

Спасибо, скорее всего, это будет так. Но мне нужно хотя бы знать, что такие объекты созданы, чтобы переопределить содержимое. Без спецификации библиотеки этот случай выглядит безнадежным для меня. –

+1

К сожалению, в настоящее время это практически невозможно. Надеюсь, ситуация изменится в Java 9: ​​https://bugs.openjdk.java.net/browse/JDK-6387296 – ntoskrnl

ответ

1

В настоящее время невозможно, и вы не можете сделать это без поддержки платформы. Память, которую использует куча Java, может быть заменена и включена, память может быть восстановлена ​​без ее очистки. Память может быть скопирована и ссылка изменена и т. Д.

Для более коротких временных рамок вы можете сделать это (не проверяемым способом) на массивах и массивах символов, но даже тогда вы можете столкнуться с трудностями ,

Таким образом, единственный способ - использовать (сертифицированный FIPS) поставщик JCE (или другой, фирменный API) с собственной поддержкой. Нативный код может быть (FIPS сертифицированной) библиотекой программного обеспечения, которая очищает ключевой материал. Или он может подключаться к аппаратно-защитному модулю (HSM) или другому аппаратурному устройству (смарт-карте или TPM), совместимому с вашим симметричным алгоритмом и/или методом деривации ключей.

+0

Что означает «не проверяемым способом»? Я должен иметь возможность сбрасывать и просматривать стек, чтобы видеть, если что-то просочилось. Я бы счел это достаточным испытанием. Или я чего-то не хватает? –

+0

Если вы не уверены, что знаете управление памятью VM с макушки головы и уверены, что используете одну и ту же виртуальную машину, ее можно было бы проверить, но я не стал бы ставить на нее свою жизнь. –

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