2014-02-19 23 views
2

根據公司政策(和其他建議),我們不應該使用String類來處理密碼。因爲這些對象是不可變的,所以直到GC釋放它爲止,所以「內存檢查」可能會顯示一個尚未釋放的包含密碼的字符串。因此,替代方案是使用char [],而不再需要覆蓋它的內容。但是,使用inputText組件時,setter方法必須接收一個String。如何處理ADF Faces中的密碼字符串?

我有一個inputText的一樣:

<af:inputText value="{myBean.password}" secret="true"/> 

而且

public class MyBean { 
... 
    private transient char[] password; 
... 
    public void setPassword(String password) { 
     this.password = password.toCharArray(); 
    } 
... 
    public void sumbit(ActionEvent e) { 
    ... 
    //Wipe password 
    for(int i = 0 ; i < password.length ; i++) { password[i] = ' '; } 
    password = null; 
    } 
} 

正如你所看到的,仍然是一個包含密碼(setter方法的參數)的String對象,我不不知道如何處理這個價值。有什麼方法可以接收char []值嗎? ADF的週期是否考慮到這是一個密碼,應該做一些特別的事情?

這是一個服務器和調用CG不是一個好主意。

+0

你可以使用它的轉換器嗎?我的意思是javax.faces.convert.converter – Leo

+0

oh nevermind ...轉換器將轉換爲字符串... – Leo

+0

爲什麼你不使用一些虛擬鍵盤或類似的東西? – Leo

回答

1

我能想到的一種方式是使用JavaScript加密庫以加密格式將密碼字段的值從客戶端傳遞到服務器,並在服務器上對其進行解密。這樣接收字符串將以非純文本格式。

1

而不是保持成分的值在bean的,存到組件本身的引用:

<af:inputText bindings="{myBean.password}" secret="true"/> 

...... 
private RichInputText password; 
...... 
public void setPassword(RichInputText password) { 
    this.password = password; 
} 

public RichInputText getPassword() { 
    return password; 
} 

,並在行動聽衆獲得該組件的值:

public void sumbit(ActionEvent e) { 
char[] pswd = password.getValue().toCharArray(); 
............ 
} 

希望這有助於。