<h: inputSecret /> Безопасность: есть ли способ использовать прямую ссылку на char [] вместо String? - PullRequest
2 голосов
/ 04 августа 2011

Преамбула: Это может быть гигантской ошибкой новичка, все разработчики в моей команде немного запутаны в Java 101, поэтому, если мы ни о чем не беспокоимся, пожалуйста, дайте мне знать. [беспокоит конкретность строковых литералов, кэшируемых в permgen]

У нас есть простая страница входа, которая в основном выглядит следующим образом: // Поддержка бина "LoginBean"

  String username;
  String password;
  //getter/setter pairs

// JSF

  <h:form id="login">
    <h:inputText value="#{loginBean.username} />
    <h:inputSecret value="#{loginBean.password} />
    <h:commandButton actionListener="#{loginBean.login} />
  </h:form>

Меня беспокоит то, что передаваемый строковый литерал может быть кэширован и открывает потенциальные дыры в безопасности. Есть ли способы настроить это так, чтобы мы полностью обходили строковый литерал? Если бы это было приложение Swing, я бы использовал JPasswordField, который явно имеет "char [] getPassword ();"

или в коде, который я хочу:

String username;
char[] password;

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

1 Ответ

4 голосов
/ 05 августа 2011

Меня беспокоит то, что передаваемый строковый литерал может быть кэширован и открывает потенциальные дыры в безопасности.

Ваша проблема действительна только частично.Строковый литерал - это тот, который фактически представлен в виде литерала в файле класса Java.Пароль, предоставленный пользователем, не является строковым литералом;вместо этого это объект String, и он не будет помещен в постоянное поколение, пока вы не вызовете String.intern().

Теперь, предполагая, что вы не совершаете глупости, вызывая String.intern(), ваша другая проблема - иметьпароли в памяти должны быть адресованы.Это уже почти невозможно в Java (из-за копирования объектов, выполняемых сборщиками мусора), и жизненный цикл JSF делает это невозможным (требуя создания объектов String для входных значений).Следующий фрагмент кода был написан мной, чтобы позволить управляемым bean-компонентам хранить пароли в виде символьных массивов путем преобразования строк в массивы char [] (и наоборот), но это полезно только для проверки соответствия, если вы поняли,что объекты String могут некоторое время находиться в памяти:

@FacesConverter("Char[]Converter")
public class CharArrayConverter implements Converter
{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String newValue)
    {
        if(newValue == null)
        {
            return newValue;
        }
        return newValue.toCharArray();
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        if(value == null)
        {
            return null;
        }
        char[] inputValue;
        try
        {
            inputValue = (char[]) value;
        }
        catch(ClassCastException ccex)
        {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Object was not present in the desired format", null);
            throw new ConverterException(message);
        }
        return new String(inputValue);
    }

}

Преобразователь используется в Facelet как:

...
<p>
    <h:outputLabel for="password" value="#{msg['Signup.password.label']}" />
    <h:inputSecret id="password" value="#{userManager.signupRequest.password}" converter="Char[]Converter" />
</p>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...