2013-08-01 99 views
1

我有一個應用程序,我需要salt密碼。爲了生成鹽,我決定使用SecureRandom。當我在我的Windows機器上時,一切都很好。然後我嘗試在基於Linux的機器上運行我的代碼(Centos 5),一切都破裂了。SecureRandom生成不同長度的值

我孤立的問題,並創造了這個測試案例:

public static void main(String[] args) { 
    SecureRandom sr = new SecureRandom(); 
    byte[] saltBytes = new byte[256]; 
    sr.nextBytes(saltBytes); 
    String salt = new String(saltBytes); 
    System.out.println(salt.length()); 
} 

Windows中的輸出爲256,但我的Linux機器上輸出的變化,是從來沒有256這似乎總是生成鹽是長度小於256.

有誰知道爲什麼會出現這種情況?

解決方案:

我剛換的新字符串行new String(saltbytes, "ASCII");

+1

你沒有設置字符串的字符集,使用'字符串(字節[]字節,字符集字符集)'構造函數。 –

+0

您不應該試圖將二進制數據放入文本字​​符串中。這通常會導致混淆。 –

回答

5

的問題是字符編碼。在通常是utf-8的linux上,這是一種可變長度編碼。如果你想要一個字符串,可以用base64代替它。

+0

同時:) –