为什么PasswordField在Vaadin中使用String而不是char []?

时间:2016-08-11 06:36:25

标签: java vaadin vaadin7

字符串易受攻击表示密码值。我注意到Vaadin PasswordField密码操纵为String

以下是PasswordField的默认构造函数,

public PasswordField() {
  setValue("");
}

我的问题:

  • 在Vaadin中使用PasswordField是否安全?
  • 哪些内部API可以确保密码的安全性?

3 个答案:

答案 0 :(得分:5)

TL; DR Vaadin PasswordField是一个简单的TextField。输入隐藏在客户端,服务器端以明文形式传输。

虽然您可以使用getConvertedValue()setConvertedValue(Object value)获取/设置您自己类型的值。请注意,您必须在使用前设置setConverter(Converter<T,?> converter)

这里有一个如何正确使用对话的示例:Creating your own converter for String - MyType conversion

完整解释

Vaadin TextFieldPasswordFieldTextArea都是AbstractField<String>的孩子。

Vaadin Docs TextField

详细说明:

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 section from Vaadin Docs明确说明:

  

你应该注意到PasswordField隐藏输入仅仅来自&#34;肩膀&#34;视觉观察。除非使用安全连接(例如HTTPS)加密服务器连接,否则输入将以明文传输,并且可能被对网络进行低级访问的任何人拦截。此外,通过利用浏览器中的JavaScript执行安全漏洞,也可以通过网络钓鱼攻击拦截浏览器中的输入。

虽然 AbstractField<T>getConvertedValue()setConvertedValue(Object value),但您可以在Object中获取/设置值。请注意,在使用之前,您需要设置setConverter(Converter<T,?> converter)

这里有一个如何正确使用对话的示例:Creating your own converter for String - MyType conversion

简而言之:

Name是一个简单的POJO,包含firstNamelastName字段及其getter / setter。

转换器类

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();
    }

}));

完整来源

答案 1 :(得分:3)

这个派对有点晚了,但是我想把我的2美分加到已讨论的内容上。

它可能纯粹是confort和代码重用,因为PasswordField只是在BE端扩展AbstractTextField,基本上是AbstractField<String>所以所有的值操作逻辑,事件处理等都是已经在那里了。

否则,可能必须实现AbstractField<char[]>并从AbstractTextField复制粘贴几乎所有内容。或者使AbstractTextField或类似的东西变得一致......

无论哪种方式,如前所述,攻击者都需要访问服务器来转储内存,在这种情况下,您可能会遇到更大的问题,无论是来自组织外部还是内部(当然,有些员工拥有自己的员工)因某些原因造成伤害): - )

关于FE,VPasswordField对应方创建了an input of type password,并且已经在Paolo Forgia的答案中讨论了有关FE-BE通信的安全问题。

答案 2 :(得分:2)

当vaadin代码在您的Web浏览器中运行时,它不再位于JVM中,因此在这种情况下使用String是正常的。密码将作为Java String存储在服务器端,因此为了访问该密码String,攻击者必须访问您的服务器。

您应该查看在生成的javascript中如何处理该密码字段。