是否可以在java中将密钥存储在堆栈上?

2022-09-02 01:56:33

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

这是非常丑陋的,但是如果秘密存储在Thread方法的堆栈上呢?仍然需要小心优雅地终止线程,以便它可以将其数据清零,但是这个问题也以旧的方式存在。run

我立即看到的一个主要问题是,我想不出一种安全的方式来获取和离开容器中的数据。您可以通过使用具有非常小的内部缓冲区的流来最大程度地降低泄露机密的可能性,但最终您会遇到与 相同的问题。[编辑:单个成员和旗帜是否有效?尽管这会将您限制为每个类加载器一个机密。这增加了更多的丑陋,但隐藏在一个写得很好的界面后面可能很容易。char[]private static byte

所以我有一堆问题,真的。

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

[编辑:在人们担心太多之前,这更像是一个思想实验,而不是其他任何东西。我绝对无意“在生产中测试”或在任何当前项目中使用它。我意识到我所谈论的真的很丑陋,可能非常笨重,并且与整个JVM结构背道而驰。我只是对这是否可能感兴趣,它是否真的实现了我的目标,以及需要什么样的英雄主义才能实现它。


答案 1

我会使用直接的字节缓冲器。它使用的内存不会被复制,并且在字节缓冲区的生命周期中只在一个地方。BTW不要使用clear(),因为这只会重置位置。您可以使用以下命令覆盖它

bb.clear();
while(bb.remaining() >= 8) bb.putLong(0);
while(bb.remaining() > 0) bb.put((byte) 0);

堆栈是否比堆更安全地抵御这些类型的攻击?

我不这么认为。

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

您可以将密钥存储为一个或两个 s。long

如果不是,JVM是否支持这种类型的字节码操作?

字节码旨在支持Java,并且比您在Java中可以执行的操作要多得多。

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

按照我的建议使用直接的字节缓冲器。;)


答案 2