String secret="foo";
WhatILookFor.securelyWipe(secret);
我需要知道它不会被 java 优化器删除。
最佳答案
字符串不能被“删除”。它是不可变的,如果没有一些真正肮脏和危险的技巧,您就无法改变它。
所以最安全的解决方案是首先不要将数据放入字符串中。请改用 StringBuilder 或字符数组,或其他一些不可变的表示形式。 (然后在完成后清除它。)
郑重声明,您可以通过多种方式更改字符串支持数组的内容。例如,您可以使用反射来获取对字符串支持数组的引用,并覆盖其内容。但是,这涉及执行 JLS 声明的具有未指定行为的操作,因此您不能保证优化器不会执行意外操作。
我个人对此的看法是,您最好锁定您的应用程序平台,这样未经授权的人就无法首先访问内存/内存转储。毕竟,如果平台没有得到妥善保护,“坏人”可能会在您删除字符串内容之前获取它。像这样的步骤对于少量的安全关键状态可能是有保证的,但是如果你有很多“ secret ”信息要处理,那么不能使用正常的字符串和字符串处理将是一个主要的麻烦。
关于java - 如何在 java 中安全地删除内存中的 secret 数据并保证它不会是 'optimized' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007991/