Является ли хорошей практикой обнуление String в Java?

У меня проблема с хранением простого пароля в памяти в виде строки. Согласно справке, поскольку Строки неизменны существует уязвимость использования типа данных String для хранения конфиденциальных данных в памяти.

https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/

Почему char [] предпочтительнее String для паролей?

Могу ли я решить эту проблему безопасности, обнулив строковую переменную вместо использования массива символов или строкового буфера / построителя.

например: String password = "пароль"; пароль = ноль;

ваш пароль должен быть массивом символов

ΦXocę 웃 Пepeúpa ツ 13.03.2018 07:15

Использовать байтовый массив?

Lyju I Edwinson 13.03.2018 07:16

вы не можете решить проблему, обнуляя строковую переменную, поскольку она не удалит этот строковый объект из String Constant Pool, вы просто назначаете нулевой «пароль», не удаляя фактический пароль из памяти.

DhaRmvEEr siNgh 13.03.2018 07:23

Обнуление строки, безусловно, поможет с утечками памяти, но тем не менее строка будет присутствовать в пуле строк Java, хотя вы не можете получить доступ к пулу строк, поскольку он поддерживается java в частном порядке. Лучше использовать массив байтов или массив Char, а также применять подходящее шифрование на случай, если вы хотите сделать вещи более безопасными.

Hades 13.03.2018 07:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
13
4
1 541
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нет. Обнуление строки приведет только к разорвать связь ссылке. Но значение по-прежнему будет существовать в пуле строк. Поскольку для экономии памяти строковые значения сохраняются в пуле строк.

Любой потенциальный хакер может получить значение, получив доступ к струнный пул.

Принимая во внимание, что, используя char [], вы можете просто рассматривать этот объект как любой другой объект. А обнуление объекта char сотрет данные из кучи во время сборки мусора.

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

Подробнее о Строковый постоянный пул.

Спасибо за ваш ответ. Но у меня другая проблема Если мы принудительно вызовем сборщик мусора после обнуления, может ли он остаться в памяти?

Sudesh Chandana 13.03.2018 07:35

Да. Сборщик мусора не работает в пуле строк так же, как на других объектах. См. stackoverflow.com/a/18407081/2458858 для большего понимания.

tryingToLearn 13.03.2018 07:39

Но значение будет попадать в пул строк только в том случае, если оно является литералом или оно было записано в формате intern(). Это больше касается контроля времени жизни пароля в памяти. Предложение использовать char[] правильное, но вам нужно очистить char[] после использования, этого недостаточно, чтобы установить его на ноль.

Kayaman 13.03.2018 08:26

Если вы хотите абсолютной безопасности, нет. Обнуление String - неправильное решение.

Причина этого в том, что обнуление не дает никаких гарантий, что String больше не доступен. Хотя это может повысить вероятность сбора мусора (и это только «может»), нет никаких гарантий относительно того, когда (или даже если) он будет собран.

Вы должны использовать либо байтовый массив, либо массив символов, а затем обнулить каждый из элементов в массиве, когда вы закончите.

Хотя это может повысить вероятность сбора мусора (и это только «может»), нет никаких гарантий относительно того, когда (или даже если) он будет собран. После обнуления, если мы вызываем сборщик мусора принудительно, может ли он остаться в памяти?
Sudesh Chandana 13.03.2018 07:35

@Sudesh, вы не можете принудительно собирать мусор. (System.gc() просто намекает, что вам нужен сборщик мусора, нет гарантии, что он что-то сделает).

Andy Turner 13.03.2018 08:18

Другие вопросы по теме