Почему PasswordField использует строку вместо char[] в Vaadin?
Строкауязвима  для значений пароля. Я заметил, что Ваадин PasswordField манипулируетпаролем  как String. 
Ниже приведен конструктор по умолчаниюPasswordField,
public PasswordField() {
  setValue("");
}
Мои вопросы:
- безопасно ли его использовать PasswordFieldв Ваадине ?
- что делает внутренний API для обеспечения безопасности пароля ?
3 ответа:
TL; DR Vaadin
PasswordFieldэто простоTextField. Вход скрыт только на стороне клиента, на стороне сервера передается открытым текстом.Хотя вы можете использовать
getConvertedValue()и ещеsetConvertedValue(Object value)для получения / установки значения в вашем собственном типе. Обратите внимание, что вы должны установитьsetConverter(Converter<T,?> converter)прежде чем использовать его.Вот вам пример правильного использования диалога: создание собственного конвертера для String-MyType преобразование
ПОЛНОЕ ОБЪЯСНЕНИЕ
Ваадин
TextField,PasswordFieldи ещеTextAreaявляются ли все детиAbstractField<String>.Подробно:
java.lang.Object |_ com.vaadin.server.AbstractClientConnector |_ com.vaadin.ui.AbstractComponent |_ com.vaadin.ui.AbstractField<java.lang.String> |_ com.vaadin.ui.AbstractTextField
PasswordFieldработает сStringиз-за своих родителей, в противном случае его следовало бы реализоватьAbstractField<char[]>.Кроме того, в
PasswordFieldраздел из Vaadin Docs говорит явно:Вы должны отметить что то
PasswordFieldскрывает вход только от "через плечо" визуального наблюдения. Если соединение с сервером не зашифровано с помощью защищенного соединения, такого как HTTPS, вход передается открытым текстом и может быть перехвачен любым пользователем с низкоуровневым доступом к сети. Кроме того, фишинговые атаки, которые перехватывают входные данные в браузере, могут быть возможны путем использования дыр в безопасности выполнения JavaScript в браузере. браузер.
Хотя ...
AbstractField<T>имеетgetConvertedValue()и ещеsetConvertedValue(Object value)которые позволяют получить / установить значение вObject, которое вы предпочитаете. Обратите внимание, что перед его использованием необходимо установитьsetConverter(Converter<T,?> converter).Вот вам пример правильного использования диалога: создание собственного конвертера для преобразования String-MyType
Вкратце из примера:
Nameявляется простым POJO СfirstNameиlastNameполя и их геттер/сеттер.Класс преобразователя
public class StringToNameConverter implements Converter<String, Name> { public Name convertToModel(String text, Locale locale) { String[] parts = text.split(" "); return new Name(parts[0], parts[1]); } public String convertToPresentation(Name name, Locale locale) throws ConversionException { return name.getFirstName() + " " + name.getLastName(); } public Class<Name> getModelType() { return Name.class; } public Class<String> getPresentationType() { return String.class; } }Основной класс
Name name = new Name("Rudolph", "Reindeer"); final TextField textField = new TextField("Name"); textField.setConverter(new StringToNameConverter()); textField.setConvertedValue(name); addComponent(textField); addComponent(new Button("Submit value", new ClickListener() { public void buttonClick(ClickEvent event) { Name name = (Name) textField.getConvertedValue(); } }));
Полный источник
com.vaadin.ui.PasswordField
com.vaadin.ui.TextField
com.vaadin.ui.TextArea
com.vaadin.ui.AbstractField<T>
com.vaadin.ui.AbstractField<T>#getConvertedValue()
com.vaadin.ui.AbstractField<T>#setConvertedValue(Object value)
com.vaadin.ui.AbstractField<T>#setConverter(Converter<T,?> converter)- Vaadin Docs
TextField- Vaadin Docs
PasswordField- пример: создание собственного конвертера для преобразования String-MyType
- разница между DTO, VO, POJO, JavaBeans?
- ответ Морфика
Немного поздновато для этой вечеринки, но я хотел бы добавить свои 2 цента к тому, что уже обсуждалось.
Это может быть чисто confort и повторное использование кода, как
PasswordFieldпросто расширяетсяAbstractTextFieldна стороне BE, которая в основном являетсяAbstractField<String>таким образом, вся логика манипулирования значениями, обработка событий и т. д. уже есть.В противном случае, вероятно, придется реализовать
AbstractField<char[]>и скопировать-вставить почти все изAbstractTextFieldтолько для этого. Или обобщитьAbstractTextFieldили нечто подобное...В любом случае, как уже говорилось, злоумышленнику потребуется доступ к серверу для сброса памяти, в случае, если у вас могут возникнуть большие проблемы, будь то извне или внутри организации (наверняка есть случаи, когда собственные сотрудники причинили вред по каким-то причинам): -)
Что касается FE, то
VPasswordFieldконтрагент создает вход типа password , и вопросы безопасности в отношении связи FE-BE уже есть это обсуждалось в ответе Паоло Форджиа.
Когда код vaadin запускается в вашем веб-браузере, он больше не находится в JVM, поэтому использование строки в этом случае нормально. Пароль будет сохранен в виде строки Java на стороне сервера, поэтому для доступа к этой строке пароля злоумышленник должен получить доступ к вашему серверу.
Вы должны посмотреть, как это поле пароля обрабатывается в созданном javascript.
