在Swing中,密码字段具有getPassword()(返回char[])方法而不是通常getText()(返回String)方法.同样,我遇到了一个不使用String来处理密码的建议.
为什么String在密码方面会对安全构成威胁?使用感觉不方便char[].
我正在寻找将Java char数组转换为字节数组而不创建中间数String,因为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));
Run Code Online (Sandbox Code Playgroud)
断言总是失败(并且,关键是,当在生产中使用代码时,密码被拒绝),但是打印语句打印出密码三次.为什么passwordBytes1AsString和passwordBytes2AsString不同passwordAsString,但看起来相同?我错过了一个空终结符或什么?我该怎么做才能使转换和非转换工作?
我需要解码Base64 char数组而不将其转换为String.char数组是密码,出于安全原因,我不允许将其转换为String(此要求是不可协商的).
该java.util.Base64.Decoder.decode方法接受byte[],ByteBuffer和String,但不是char[].
使用String存储敏感数据的安全问题
根据Jim Archer的评论