我正在尋找將Java char數組轉換爲字節數組而不創建中間String
,因爲char數組包含密碼。我擡頭一對夫婦的方法,但他們都忽視了:將char數組轉換爲字節數組並再次返回
char[] password = "password".toCharArray();
byte[] passwordBytes1 = new byte[password.length*2];
ByteBuffer.wrap(passwordBytes1).asCharBuffer().put(password);
byte[] passwordBytes2 = new byte[password.length*2];
for(int i=0; i<password.length; i++) {
passwordBytes2[2*i] = (byte) ((password[i]&0xFF00)>>8);
passwordBytes2[2*i+1] = (byte) (password[i]&0x00FF);
}
String passwordAsString = new String(password);
String passwordBytes1AsString = new String(passwordBytes1);
String passwordBytes2AsString = new String(passwordBytes2);
System.out.println(passwordAsString);
System.out.println(passwordBytes1AsString);
System.out.println(passwordBytes2AsString);
assertTrue(passwordAsString.equals(passwordBytes1) || passwordAsString.equals(passwordBytes2));
斷言總是失敗(並且,重要的是,當代碼中,該密碼將被拒絕使用),但打印報表三次打印出密碼。爲什麼passwordBytes1AsString
和passwordBytes2AsString
與passwordAsString
不同,但看起來完全相同?我錯過了一個空終止符或什麼?我能做些什麼來使轉換和非轉換工作?
爲什麼你要避免創建一箇中間串? – KarlP 2011-02-08 10:53:38
Sun建議將其作爲最佳實踐:http://download.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#PBEEx字符串是不可變的,因此無法像清零一樣字符數組 - 相反,您的密碼在內存中停留的時間不確定。 – Scott 2011-02-08 11:09:30