Tôi đang tìm cách chuyển đổi mảng Java thành mảng byte mà không cần tạo một mã trung gian String
, vì mảng char chứa mật khẩu. Tôi đã nhìn lên một vài phương pháp, nhưng tất cả dường như thất bại:Chuyển mảng char thành mảng byte và ngược lại
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));
Khẳng định luôn thất bại (và, giới phê bình, khi mã được sử dụng trong sản xuất, mật khẩu bị từ chối), nhưng bản in báo cáo in ra mật khẩu ba lần. Tại sao passwordBytes1AsString
và passwordBytes2AsString
khác với passwordAsString
, nhưng xuất hiện giống hệt nhau? Tôi bỏ lỡ một terminator null hay cái gì? Tôi có thể làm gì để thực hiện công việc chuyển đổi và không chuyển đổi?
Tại sao Bạn muốn tránh việc tạo ra một trung gian Chuỗi? – KarlP
Sun đề xuất phương pháp này là phương pháp hay nhất: http://download.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#PBEEx Strings không thay đổi và do đó không thể được xóa như mảng char - thay vào đó, mật khẩu của bạn bị treo trong bộ nhớ trong một khoảng thời gian không xác định. – Scott