У меня проблема с хранением простого пароля в памяти в виде строки. Согласно справке, поскольку Строки неизменны существует уязвимость использования типа данных String для хранения конфиденциальных данных в памяти.
https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/
Почему char [] предпочтительнее String для паролей?
Могу ли я решить эту проблему безопасности, обнулив строковую переменную вместо использования массива символов или строкового буфера / построителя.
например: String password = "пароль"; пароль = ноль;
Использовать байтовый массив?
вы не можете решить проблему, обнуляя строковую переменную, поскольку она не удалит этот строковый объект из String Constant Pool, вы просто назначаете нулевой «пароль», не удаляя фактический пароль из памяти.
Обнуление строки, безусловно, поможет с утечками памяти, но тем не менее строка будет присутствовать в пуле строк Java, хотя вы не можете получить доступ к пулу строк, поскольку он поддерживается java в частном порядке. Лучше использовать массив байтов или массив Char, а также применять подходящее шифрование на случай, если вы хотите сделать вещи более безопасными.




Нет. Обнуление строки приведет только к разорвать связь ссылке. Но значение по-прежнему будет существовать в пуле строк. Поскольку для экономии памяти строковые значения сохраняются в пуле строк.
Любой потенциальный хакер может получить значение, получив доступ к струнный пул.
Принимая во внимание, что, используя char [], вы можете просто рассматривать этот объект как любой другой объект. А обнуление объекта char сотрет данные из кучи во время сборки мусора.
Еще лучшим вариантом будет использование байтового массива.
Подробнее о Строковый постоянный пул.
Спасибо за ваш ответ. Но у меня другая проблема Если мы принудительно вызовем сборщик мусора после обнуления, может ли он остаться в памяти?
Да. Сборщик мусора не работает в пуле строк так же, как на других объектах. См. stackoverflow.com/a/18407081/2458858 для большего понимания.
Но значение будет попадать в пул строк только в том случае, если оно является литералом или оно было записано в формате intern(). Это больше касается контроля времени жизни пароля в памяти. Предложение использовать char[] правильное, но вам нужно очистить char[] после использования, этого недостаточно, чтобы установить его на ноль.
Если вы хотите абсолютной безопасности, нет. Обнуление String - неправильное решение.
Причина этого в том, что обнуление не дает никаких гарантий, что String больше не доступен. Хотя это может повысить вероятность сбора мусора (и это только «может»), нет никаких гарантий относительно того, когда (или даже если) он будет собран.
Вы должны использовать либо байтовый массив, либо массив символов, а затем обнулить каждый из элементов в массиве, когда вы закончите.
@Sudesh, вы не можете принудительно собирать мусор. (System.gc() просто намекает, что вам нужен сборщик мусора, нет гарантии, что он что-то сделает).
ваш пароль должен быть массивом символов