Как "скрыть" конфиденциальные системные свойства, такие как пароли, установленные Java-приложениями?
Я поддерживаю существующий продукт Java (который имеет ОГРОМНУЮ кодовую базу). Я обнаружил, что он устанавливает (и получает) два своих внутренних пароля в качестве системных свойств Java, не менее чем в 4-5 разных местах (методах). Теперь проблема в том, что пароли хранятся в виде обычного текста в свойствах системы Java, и поэтому то же самое видно для внешних объектов, поскольку приложение не использует какой-либо Java Security Manager. Например, если приложение (процесс) выполняется на порту с номером 1234, мы можем запустить команду Java:
jinfo -sysprops 1234
для просмотра обоих паролей в качестве значений соответствующих системных свойств Java. Я хотел бы спросить, есть ли какое-либо средство от этого, не слишком меняя существующую кодовую базу? Желаемым эффектом будет "скрыть" два системных свойства Java (обозначающих два пароля) от всех внешних объектов.
Можно отметить, что введение диспетчера безопасности Java в приложение может не быть решением, как если бы мы отозвали разрешения на чтение из указанных двух свойств системы Java с помощью диспетчера безопасности Java, коды приложения, которые читают эти свойства, потерпели бы крах. То же самое применимо для хранения паролей в зашифрованном виде, так как это приведет к сбою всех кодов в приложении, которые ожидают чтения паролей в виде открытого текста.
1 ответ
Так как вы сказали:
... не менее чем в 4-5 разных местах...
и вы действительно не хотите вносить серьезные изменения в код, я бы:
- Введите пароль в зашифрованном виде.
- Пройдите через эти 4-5 мест (это не так уж много!) И вызовите метод-обертку, который вы должны написать отдельно:
MyPassUtil.getXYZPassword()
который внутренне вызывает System.getProperty(), чтобы получить зашифрованный пароль, расшифровать его и вернуть текстовую версию тому, кто его вызывает.
Имейте в виду, однако, что таким образом ключ дешифрования и алгоритм хранятся в приложении, и хороший декомпилятор Java (JD-GUI или CFR) все равно вернет эту информацию. Другими словами, любой, у кого есть доступ к файлу JAR, все же может получить информацию с небольшим усилием, что я предполагаю, так как можно вызвать jinfo
, они также могут получить файл JAR.
Лучше всего использовать некоторую форму хранилища ключей, которую, опять же, вы можете легко реализовать, выполнив метод обертки, упомянутый в шаге 2, не затрагивая того, кто его использует.
Также несколько советов по безопасности:
Если это соединение SSH / SFTP, установите ключи SSH между двумя компьютерами и исключите использование паролей.
Если это соединение с базой данных, по крайней мере, сконфигурируйте СУБД, чтобы разрешить соединения только с IP-адреса данного компьютера. Если соединение через Интернет, и вы находитесь за NAT, сначала настройте VPN и направьте трафик между хостами через него.
Для других настроек попробуйте и посмотрите, есть ли другие советы, которые вы можете сделать аналогично этим двум пунктам, чтобы улучшить безопасность этих паролей.