Относительно пула констант Java - PullRequest
9 голосов
/ 28 марта 2011

Это касается пула констант Java String.В одной из моих программ я расшифровываю пароль для базы данных и сохраняю его в виде строки.Я слышал, что строки Java будут храниться в пуле констант, и они не будут уничтожены при перезапуске виртуальной машины или загрузчике ClassLoader, который загрузил строки.

В этом случае мои пароли будут сохранены вСтрунный бассейн.Я очень обеспокоен этой проблемой.Есть ли другой способ уничтожить эти литералы или что-нибудь еще, что я могу сделать.

Пожалуйста, предложите на этом,

С уважением, Санни.

Ответы [ 3 ]

6 голосов
/ 28 марта 2011

Здесь есть несколько разных проблем. Во-первых, термин «постоянный пул» относится к очень специфической части файлов классов для строковых и числовых литералов или к структурам данных, сгенерированным из этой части файлов классов, которые находятся в JVM. Пароль не будет храниться здесь, если он не является частью файлов классов.

Однако некоторые объекты String действительно хранятся и совместно используются в программе через интернирование String. Любой строковый литерал автоматически интернируется, как и любые строки, для которых вы вызываете метод intern (). Насколько я знаю, однако, никакие другие строки не сохраняются таким образом, поэтому, если вы сами автоматически не интернируете строки, содержащие пароли, я не думаю, что вам нужно беспокоиться об этом.

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

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

3 голосов
/ 28 марта 2011

Это относится только к строковым литералам и строкам, для которых вы вызвали метод intern().Подумайте об этом: если бы он применялся ко всем строкам, вы бы быстро исчерпали память, например, в приложении сервлета, которое обрабатывает параметры запроса с различными (строковыми) значениями.

0 голосов
/ 22 ноября 2012

Чувак, используйте строковый буфер для получения пароля и выполнения ваших (предположительно) операций строкового типа.

StringBuffer хранит строки как char [], которые можно удалить.Или переопределено или что там у тебя.Скажите StringBuffer.delete(0,StringBuffer.length());

Или просто получите пароль БД в виде символа [] и работайте непосредственно над этим - но я думаю, что способ StringBuffer (при условии, что вы сделали весь свой код, используя методы String) будет прощепрыжок.

...