清除所有线程中的数组

Mar*_*234 5 java

在Java中,建议char[]用于存储密码或其他敏感信息,以便在不再需要数据时能够手动清除它。

如何在所有线程中清除这样的数组?如果我理解正确,线程可能只会在其缓存中执行更改,而不会在共享内存中执行更改,因此以下操作将无法可靠地运行:

char[] password = ...
...
Arrays.fill(password, '\0');
Run Code Online (Sandbox Code Playgroud)
  • 这个假设是正确的还是线程总是写到共享内存?
  • 是否有必要使用volatile(或其他同步方式)确保共享内存已更新?
    • 是否需要事前发生关系,因为编译器/ JVM会由于优化而忽略内存同步?
  • 其他线程是否必须先建立先发生后关系才能从其缓存中清除阵列内容,还是可以忽略不计?可能是因为缓存将用于其他更频繁访问的数据,并且由于不再使用该数组,因此该数组将被丢弃。

编辑:char[]应该用于密码的语句是基于为什么为什么char []优于String?但是,再次查看之后,这也引起了一些争议。

jbx*_*jbx 2

将数组引用设置为易失性并不能保证对其内容的易失性访问。AtomicIntegerArray如果您想要线程安全的共享访问,您可以使用。否则,您可能希望将char数组包装到自定义类中,并在其方法周围进行同步。虽然后者的性能会较差。

请注意,使用字符数组而不是字符串可能并不真正更安全。如果攻击者可以访问您的计算机,则在 char 数组包含数据期间转储进程内存仍然是可能的,如果他这样做了,您将面临比这更严重的问题。此外,垃圾收集可能会在压缩阶段将您的数据移动到其他地方,将您的密码留在尚未被覆盖的已释放“垃圾”内存中(假设您正在谈论线程之间的共享成员,则更有可能发生这种情况,因为您的char 数组将被视为长期存在并复制到为老一代对象保留的内存空间)。