【发布时间】:2011-06-23 08:14:23
【问题描述】:
我希望在不创建中间String 的情况下将Java 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 不同,但看起来相同?我错过了一个空终止符还是什么?我该怎么做才能使转换和取消转换工作?
【问题讨论】:
-
为什么要避免创建中间字符串?
-
Sun 建议将其作为最佳实践:download.oracle.com/javase/1.5.0/docs/guide/security/jce/… 字符串是不可变的,因此不能像 char 数组那样清零 - 相反,您的密码会在内存中停留不确定的时间。