wei*_*iji 36 java memory security
我正在讨论如何保护存储在Java程序中的敏感信息(例如密码).根据安全要求,清除包含敏感信息的存储器,例如通过将字节值设置为全零.担心的是攻击者可以观察与应用程序进程相关的内存,因此我们希望尽可能多地限制此类敏感信息的时间窗口.以前,项目涉及C++,所以memset()就足够了.
(顺便说一下,memset()的使用已经引起了质疑,因为已知一些编译器会根据以下假设来优化它的使用:由于以后不使用内存,所以不需要将其归零.第一个地方.对于那些谷歌用于"memset"和"清晰记忆"等的人来说,这是一个免责声明.
现在,我们手中有一个Java项目被迫遵守这个要求.
对于Java对象,我的理解是:
对于原始人,我的理解是:
我的同事声称Java原语是不可变的,并且NSA和Oracle都提供了有关此要求缺乏Java支持的文档.
我的立场是,原语可以(至少在某些情况下)通过将值设置为零(或布尔值为false)来归零,并且以这种方式清除内存.
我正在尝试验证JLS或其他"官方"文档中是否存在关于JVM在基元内存管理方面所需行为的语言.我能找到的最接近的是Oracle网站上的"Java编程语言的安全编码指南",其中提到了在使用后清除字符串数组.
当我的同事称原语不可变时,我会对定义进行狡辩,但我很确定他的意思是"记忆不能被适当归零" - 让我们不要担心.我们没有讨论他是否意味着最终变量 - 从我们正在谈论的背景来看.
对此有任何确定的答案或参考?我很感激任何可以告诉我错在哪里或确认我是对的.
编辑:经过进一步的讨论,我已经能够澄清我的同事正在考虑原始包装,而不是原始本身.因此,我们留下了如何安全地清除内存的原始问题,最好是对象.此外,澄清一下,敏感信息不仅仅是密码,还包括IP地址或加密密钥等.
是否有任何商业JVM提供某些对象的优先级处理功能?(我想这实际上会违反Java规范,但我想我会问,以防万一我错了.)
奇怪,从来没有想到过这样的事情。
我的第一个想法是创建一个 char[100] 来存储您的密码。将其放在那里,将其用于任何用途,然后执行循环将每个字符设置为空白。
问题是,密码有时会变成数据库驱动程序内部的字符串,它可以在内存中存在 0 到无限秒。
我的第二个想法是通过某种对 C 的 JNI 调用来完成所有身份验证,但如果您尝试使用 JDBC 之类的东西,那将非常困难......
| 归档时间: |
|
| 查看次数: |
10185 次 |
| 最近记录: |