在Java中,建议char[]用于存储密码或其他敏感信息,以便在不再需要数据时能够手动清除它。
如何在所有线程中清除这样的数组?如果我理解正确,线程可能只会在其缓存中执行更改,而不会在共享内存中执行更改,因此以下操作将无法可靠地运行:
char[] password = ...
...
Arrays.fill(password, '\0');
Run Code Online (Sandbox Code Playgroud)
volatile(或其他同步方式)确保共享内存已更新?
编辑:char[]应该用于密码的语句是基于为什么为什么char []优于String?但是,再次查看之后,这也引起了一些争议。
将数组引用设置为易失性并不能保证对其内容的易失性访问。AtomicIntegerArray如果您想要线程安全的共享访问,您可以使用。否则,您可能希望将char数组包装到自定义类中,并在其方法周围进行同步。虽然后者的性能会较差。
请注意,使用字符数组而不是字符串可能并不真正更安全。如果攻击者可以访问您的计算机,则在 char 数组包含数据期间转储进程内存仍然是可能的,如果他这样做了,您将面临比这更严重的问题。此外,垃圾收集可能会在压缩阶段将您的数据移动到其他地方,将您的密码留在尚未被覆盖的已释放“垃圾”内存中(假设您正在谈论线程之间的共享成员,则更有可能发生这种情况,因为您的char 数组将被视为长期存在并复制到为老一代对象保留的内存空间)。
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |