Как стереть пароли из памяти при использовании токенов имени пользователя с JBossWS?
-
03-07-2019 - |
Вопрос
Я использую веб-службы JBoss для приложения платежных услуг.В какой-то момент мне нужно выполнить удаленные вызовы SOAP к поставщику платежных услуг, и мне нужно пройти аутентификацию с помощью токена имени пользователя.
Единственный известный мне способ сделать это с помощью JBossWS выглядит так:
Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, "foobar");
requestContext.put(BindingProvider.PASSWORD_PROPERTY, "changeme");
Но проблема здесь в том, что пароль «changeme» теперь находится в памяти как объект String, и я не могу контролировать, когда он будет удален, если вообще когда-либо, будет собран мусором.Если на этом этапе злоумышленник сбросит память, он сможет найти учетные данные.
Есть ли другой способ совершать безопасные вызовы SOAP с помощью JBossWS, где я могу контролировать, как долго пароль остается в памяти?
Решение
Я почти уверен, что способа нет.Строки в Java неизменяемы, поэтому вы не сможете переписать строку.Вы можете использовать массив байтов для хранения пароля, и этот массив байтов можно переписать.Но вам, вероятно, в какой-то момент все равно придется преобразовать его в строку...
С другой стороны, если злоумышленник имеет достаточный доступ к вашей машине, чтобы получить дамп памяти, вы все равно облажались.Если злоумышленник уже имеет такой доступ, он может делать практически все, что захочет...