gpt4 book ai didi

java - 跨所有线程清除数组

转载 作者:搜寻专家 更新时间:2023-10-31 20:16:38 24 4
gpt4 key购买 nike

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

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

char[] password = ...
...
Arrays.fill(password, '\0');
  • 这个假设是否正确,或者线程是否总是写入共享内存?
  • 是否有必要使用volatile(或其他同步)来确保共享内存被更新?
    • 这是否需要先于关系,因为编译器/JVM 否则会因优化而忽略内存同步?
  • 其他线程是否必须建立先发生关系才能从缓存中清除数组内容,或者这可以忽略不计?可能是因为缓存将用于其他更频繁访问的数据,并且数组将被丢弃,因为它不再被积极使用。

编辑:char[] 应用于密码的声明基于 Why is char[] preferred over String for passwords? ,不过再看一遍,这也有点争议。

最佳答案

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

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

关于java - 跨所有线程清除数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56825959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com