我如何归零java中的密钥?

Lop*_*per 7 java security android cryptography secret-key

以下java代码是否足以清除内存中的密钥(将其所有字节值设置为0)?

zerorize(SecretKey key)
{
    byte[] rawKey = key.getEncoded();
    Arrays.fill(rawKey, (byte) 0);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,该getEncoded方法是否返回实际密钥的副本或引用?如果返回副本,那么如何清除密钥作为安全措施?

小智 6

在尝试清除密钥之前,应首先检查SecretKey接口的实现是否也实现了javax.security.auth.Destroyable接口.如果是这样,当然更喜欢.


aio*_*obe 0

换句话说, getEncoded 方法是否返回实际密钥的副本或引用?

key.getEncoded()将返回对数组的引用。

如果执行 Array.fill 时 key 的内容被丢弃,则取决于返回的数组是否支持该 key 鉴于文档,在我看来,密钥的编码似乎是密钥的另一种表示形式,即密钥不受返回的数组支持。

不过很容易找出来。请尝试以下操作:

byte[] rawKey = key.getEncoded();
Arrays.fill(rawKey, (byte) 0);

byte[] again = key.getEncoded();
Log.d(Arrays.equals(rawKey, again));
Run Code Online (Sandbox Code Playgroud)

如果输出是false,则您知道密钥仍然存储在 中SecretKey