问题如下:我需要确保,在完成某些数据加密之后,无法从应用程序内存中提取密码/派生密钥(现有密码/密钥已被重写)。我知道这不是一件容易的事。我认为我仍然可以在我自己实现的应用程序的核心部分做到这一点。
但是,对外部库的调用(比如那些实现JCA/JCE的库)呢?如果没有JCA/JCE,我就无法进行加密(比方说Bouncy城堡)。我如何确定库没有创建克隆或其他我不知道的对象,这可能会显示密码后,有人转储内存离线分析它。
我能告诉库清除它一直在使用的内存吗?或者也许还有其他方法解决这个问题?
发布于 2014-02-10 19:33:50
目前是不可能的,如果没有平台支持,您就无法做到这一点。Java堆使用的内存可以交换出去,并且可以在不删除内存的情况下回收内存。内存可能会被复制,引用也会改变等等。
对于更短的时间框架,您可能能够在字节数组和字符数组上(以一种不可测试的方式)这样做,但即使这样,您也可能遇到麻烦。
因此,唯一的方法是使用(FIPS认证的) JCE提供者(或其他专有API)并提供本机支持。本机代码可以是一个(FIPS认证的)软件库,用于清理关键材料。或者它可以连接到与对称算法和/或密钥派生方法兼容的硬件安全模块(HSM)或其他硬件设备(智能卡或TPM)。
https://stackoverflow.com/questions/21680462
复制相似问题