java - 如何在 java 中安全地删除内存中的 secret 数据并保证它不会是 'optimized' ?

标签 java security

String secret="foo";
WhatILookFor.securelyWipe(secret);

我需要知道它不会被 java 优化器删除。

最佳答案

字符串不能被“删除”。它是不可变的,如果没有一些真正肮脏和危险的技巧,您就无法改变它。

所以最安全的解决方案是首先不要将数据放入字符串中。请改用 StringBuilder 或字符数组,或其他一些不可变的表示形式。 (然后在完成后清除它。)


郑重声明,您可以通过多种方式更改字符串支持数组的内容。例如,您可以使用反射来获取对字符串支持数组的引用,并覆盖其内容。但是,这涉及执行 JLS 声明的具有未指定行为的操作,因此您不能保证优化器不会执行意外操作。


我个人对此的看法是,您最好锁定您的应用程序平台,这样未经授权的人就无法首先访问内存/内存转储。毕竟,如果平台没有得到妥善保护,“坏人”可能会在您删除字符串内容之前获取它。像这样的步骤对于少量的安全关键状态可能是有保证的,但是如果你有很多“ secret ”信息要处理,那么不能使用正常的字符串和字符串处理将是一个主要的麻烦。

关于java - 如何在 java 中安全地删除内存中的 secret 数据并保证它不会是 'optimized' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007991/

相关文章:

java - 递归回文法调试

java随着鼠标的移动绘制线条

java - 在无限循环中执行事件

javascript - 通过 javascript 将用户可输入的文本存储到隐藏表单中是否危险?

ios - 如何在 SWIFT 3 或 4 中的 REST API 调用期间安全地处理 cookie?

security - 处理 Web 应用程序的身份验证

java - 使用 Gson 填充 Kotlin 数据类

java - 在 android 中解决 java.lang.Throwable 异常

mongodb - 通过 mongodb 中的字段与授权 token 授权资源(例如图像)访问?

php - 奇怪的 apache/PHP POST 错误