是否有可能在Java中存储堆栈的秘密?

Ben*_*rns 21 java memory security jvm java-bytecode-asm

在Java中,存储密码的旧方法(如密码)可以使用,char[]因为您可以在完成后覆盖其数据.然而,由于垃圾收集器在重新组织堆时会复制内容,因此这被证明是不安全的.在某些体系结构中,可能会释放页面,并且当其他程序分配同一页面时,秘密将保留.

这非常难看,但是如果秘密存储在Thread run方法的堆栈上呢?仍需要注意优雅地终止线程,以便它可以将其数据清零,但这个问题也以旧的方式出现.

我直接看到的一个主要问题是我无法想到一种安全的方法来获取数据进出容器.您可以通过使用具有非常小的内部缓冲区的流来最小化泄露秘密的可能性,但最终您最终会遇到与此相同的问题char[].[编辑:单个private static byte成员和国旗会有效吗?虽然这会限制每个ClassLoader一个秘密.这增加了更多的丑陋,但它可能很容易隐藏在一个写得很好的界面后面.]

所以我真的有很多问题.

堆栈比这些类型的攻击更安全吗?是否有任何纯Java机制以对这个问题有用的方式在两个不同的堆栈帧之间执行堆栈到堆栈的复制?如果没有,JVM是否甚至支持字节码中的这种类型的操作?

[编辑:在人们过分担心之前,这更像是一个思想实验而不是其他任何东西.我绝对没有打算"在生产中测试"或在任何当前项目中使用它.我意识到我所说的内容真的很难看,可能非常笨重,并且可以对抗整个JVM结构.我只是对它是否有可能感兴趣,它是否真正实现了我的目标,以及它需要什么样的英雄才能实现目标.

Pet*_*rey 12

我会使用直接的ByteBuffer.它使用的内存不会被复制,只能在ByteBuffer生命周期的一个地方使用.BTW不使用clear(),因为这只是重置位置.你可以用它覆盖它

bb.clear();
while(bb.remaining() >= 8) bb.putLong(0);
while(bb.remaining() > 0) bb.put((byte) 0);
Run Code Online (Sandbox Code Playgroud)

堆栈比这些类型的攻击更安全吗?

我不这么认为.

是否有任何纯Java机制以对这个问题有用的方式在两个不同的堆栈帧之间执行堆栈到堆栈的复制?

您可以将秘密存储为一两个long.

如果没有,JVM是否甚至支持字节码中的这种类型的操作?

字节代码旨在支持Java,并且只能在Java中执行.

我只是对它是否有可能感兴趣,它是否真正实现了我的目标,以及它需要什么样的英雄才能实现它

按照我的建议使用直接的ByteBuffer.;)

  • 堆ByteBuffer使用byte [],直接ByteBuffer使用本机内存.gc没有触及本机内存. (2认同)