Java 字节数组到字符数组的正确解码

Java 字节数组到字符数组的正确解码,java,decoding,Java,Decoding,通过消除字符串中的存储(最终存储在堆中),使密码处理更加安全。我有以下现行守则: String pw = new String(buffer, 0, len, "UTF-32LE"); 我想到了: Charset charSet = Charset.forName("UTF-32LE"); ByteBuffer byteBuffer = ByteBuffer.wrap(buffer, 0, len); CharBuffer charBuffer = charSet.decode(byteBuf

通过消除字符串中的存储(最终存储在堆中),使密码处理更加安全。我有以下现行守则:

String pw = new String(buffer, 0, len, "UTF-32LE");
我想到了:

Charset charSet = Charset.forName("UTF-32LE");
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer, 0, len);
CharBuffer charBuffer = charSet.decode(byteBuffer);
charArray = new char[charBuffer.length()];
for (int i = 0; i < charBuffer.length(); ++i)
{
    charArray[i] = charBuffer.charAt(i);
}
Charset Charset=Charset.forName(“UTF-32LE”);
ByteBuffer ByteBuffer=ByteBuffer.wrap(缓冲区,0,len);
CharBuffer CharBuffer=charSet.decode(byteBuffer);
charArray=新字符[charBuffer.length()];
对于(int i=0;i
请注意,我们支持许多不同的语言,所以我不太确定如何最好地彻底测试这种方法

  • 这是正确的吗?这种方法是否有注意事项
  • 这是最好的方法还是我遗漏了更简单的方法

  • 感谢您的反馈或建议。

    我不确定您想要实现什么目标。起初,我以为您希望删除存储在堆上的数据,但后来我看到了字符数组。在java中,每个数组都是一个对象,每个对象都存储在堆中。引用变量可以降落在堆栈上,但它们只是处理程序,而不是对象本身

    你的数据不是还在堆里吗?您试图反击的威胁是什么?字符数组在使用后可以归零,但字符串是不可变的,并且在垃圾收集之前一直保留在堆上。建议将密码存储为字符数组,而不是字符串(如果必须将其存储在堆中)。当您使用数组时,它是从堆中分配的,但是,一旦完成了需要对数组执行的操作,就可以将其归零。当您使用字符串时,您无法更新它--该不可变字符串位于堆上,可能会保留很长时间,因此,如果你最担心的是有人可能从没有GC’ed的字符串对象中获取密码,那么你的方法会更安全,但棘手的部分是应用程序用户提供密码的界面。当在获取密码的过程中使用了更多的第三方库时,这就变得更加棘手了。JPasswordField似乎表现正常