Назначьте значение null для строки var, чтобы удалить конфиденциальные данные.

просматривая здесь некоторые результаты Fortify, и он говорит мне не использовать строковые типы данных для конфиденциальных данных, потому что они могут слишком долго зависать в памяти. Это раскрывает данные пользователя в случае несвязанной атаки на память, такой как Heartbleed.

Если я устанавливаю для строки var значение null после использования, действительно ли эта ячейка памяти очищается или создается копия var для хранения значения null?

Спасибо


person Dave C    schedule 19.05.2015    source источник


Ответы (2)


Я думаю, вы задаете неправильный вопрос.

Если вы установите для переменной значение null, то эта ссылка обязательно указывает на значение null. Исходное значение может быть удалено сборщиком мусора.

Проблема в том, что строки немного сложнее. Вопрос, который вы должны задать: почему еще строки могут оставаться в памяти?

Одним из ответов на этот вопрос является пул строковых литералов. Google — ваш друг, но вот неплохое начало:

Что такое Java пул строк и чем «s» отличается от новой строки («s»)?

Когда строка будет собираться мусором в java

Сборка мусора строковых литералов

person Kevin Workman    schedule 19.05.2015
comment
Итак, прочитав все это, кажется, что лучший метод - это рекомендация от Fortify и @K139 - используйте Char[] и обнулите его, когда закончите. - person Dave C; 19.05.2015
comment
@DaveC Если вы беспокоитесь, что кто-то столкнется с проблемой чтения памяти вашей программы, что мешает им просто прочитать массив символов? - person Kevin Workman; 19.05.2015
comment
Я бы не сказал, что Fortify на 100% точен, но логика такова. Если я загружаю Char[ ] с конфиденциальными данными, я могу стереть их сразу после использования, и данные больше не находятся в памяти. Такие атаки, как Heartbleed, полагаются на данные, хранящиеся в памяти достаточно долго, чтобы их мог прочитать код эксплойта. Использование Char[ ] не полностью устраняет уязвимость, но если время в памяти уменьшается с X минут до X миллисекунд, то вероятность значительно снижается. - person Dave C; 20.05.2015
comment
И у меня меньше шумных находок Fortify, чтобы смотреть в каждом выпуске. :-Д - person Dave C; 20.05.2015
comment
С другой стороны, ваши коллеги будут наследовать и поддерживать странный код. У всего есть цена. - person David Soroko; 20.05.2015

Если вы установите для ссылок String значение null, то они могут быть не удалены из фактической памяти и могут быть доступны для потенциального хакера.

Вы можете использовать Char[] и установить для него нулевые/недопустимые символы, чтобы избежать этой проблемы, а также всегда лучше хранить данные sensitive в формате encrypted.

person K139    schedule 19.05.2015
comment
Согласен, лучше зашифровать, но в какой-то момент он должен быть открытым текстом, чтобы его можно было использовать. - person Dave C; 19.05.2015