小编wei*_*iji的帖子

Java安全性:如何清除/清除与对象关联的内存?(和/或确保这是特定变量的唯一实例/副本)

我正在讨论如何保护存储在Java程序中的敏感信息(例如密码).根据安全要求,清除包含敏感信息的存储器,例如通过将字节值设置为全零.担心的是攻击者可以观察与应用程序进程相关的内存,因此我们希望尽可能多地限制此类敏感信息的时间窗口.以前,项目涉及C++,所以memset()就足够了.

(顺便说一下,memset()的使用已经引起了质疑,因为已知一些编译器会根据以下假设来优化它的使用:由于以后不使用内存,所以不需要将其归零.第一个地方.对于那些谷歌用于"memset"和"清晰记忆"等的人来说,这是一个免责声明.

现在,我们手中有一个Java项目被迫遵守这个要求.

对于Java对象,我的理解是:

  • 一个空的引用只会改变引用的值; 堆上的内存对象仍然包含数据
  • 像String这样的不可变对象无法修改它的数据(或者至少不容易,在具有适当启用的安全管理器的VM的范围内)
  • 世代垃圾收集器可以使对象的副本所有的地方(如注意这里)

对于原始人,我的理解是:

  • 本地方法中的原始类型变量将在堆栈上分配,并且:
  • 当你改变它的值时,你可以直接在内存中修改它(而不是使用引用来处理堆上的对象).
  • 在某些情况下,副本可以/将在"幕后"进行,例如将其作为参数传递给方法或装箱(自动或非自动)创建包含另一个具有相同值的原始变量的包装器的实例.

我的同事声称Java原语是不可变的,并且NSA和Oracle都提供了有关此要求缺乏Java支持的文档.

我的立场是,原语可以(至少在某些情况下)通过将值设置为零(或布尔值为false)来归零,并且以这种方式清除内存.

我正在尝试验证JLS或其他"官方"文档中是否存在关于JVM在基元内存管理方面所需行为的语言.我能找到的最接近的是Oracle网站上的"Java编程语言的安全编码指南",其中提到了在使用后清除字符串数组.

当我的同事称原语不可变时,我会对定义进行狡辩,但我很确定他的意思是"记忆不能被适当归零" - 让我们不要担心.我们没有讨论他是否意味着最终变量 - 从我们正在谈论的背景来看.

对此有任何确定的答案或参考?我很感激任何可以告诉我错在哪里或确认我是对的.

编辑:经过进一步的讨论,我已经能够澄清我的同事正在考虑原始包装,而不是原始本身.因此,我们留下了如何安全地清除内存的原始问题,最好是对象.此外,澄清一下,敏感信息不仅仅是密码,还包括IP地址或加密密钥等.

是否有任何商业JVM提供某些对象的优先级处理功能?(我想这实际上会违反Java规范,但我想我会问,以防万一我错了.)

java memory security

36
推荐指数
1
解决办法
1万
查看次数

IntelliJ社区Perforce插件

我曾经喜欢使用IntelliJ,但我的新公司不会在IDE上花钱.现在随着IntelliJ社区版的发布,我唯一的障碍是我的公司使用Perforce.有没有人知道是否有与Community Edition一起使用的Perforce插件?

perforce open-source intellij-idea

11
推荐指数
1
解决办法
4212
查看次数

如果在两个文件中检测到错误,如何使Ant构建失败?

我使用Ant基本上使用exec任务来运行一些SQL脚本来进行数据库构建.

但是,在脚本执行期间可能会出现错误(例如,无法正确删除已连接的用户等),因此我通过查看两个输出日志文件来检查这一点.

以下是相关目标的片段:

<target name="build">
    <echo message="Add foo bar baz"/>
    <exec executable="${db.sqlplus}">
    </exec>

    <echo message="Load x y z"/>
    <exec executable="${db.sqlplus}" dir="foobar">
    </exec>

    <!--Check the log files here-->
    <antcall target="check-log-file">
        <param name="file.to.check" value="${output.log.1}"/>
    </antcall>

    <antcall target="check-log-file">
        <param name="file.to.check" value="${output.log.2}"/>
    </antcall>

    <antcall target="fail-if-error"/>
</target>

<!--=============================================================================
    Check the file named in the property file.to.check to see if there are errors.

    The way this works is to find all lines containing the text "ERROR" and put
    them into a separate file.  Then it checks …
Run Code Online (Sandbox Code Playgroud)

ant

6
推荐指数
1
解决办法
7376
查看次数

标签 统计

ant ×1

intellij-idea ×1

java ×1

memory ×1

open-source ×1

perforce ×1

security ×1