销毁 SecretKey 会抛出 DestroyFailedException?

Loc*_*Loc 4 java java-8

我正在编写一个函数来使用 SecretKeyFactory 基于密码生成密钥(字节)。我想在不再需要 SecretKey 实例时销毁它,但它会引发异常。

try {
    byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");

    PBEKeySpec keySpec = new PBEKeySpec("password".toCharArray(), salt, 1000, 256);

    SecretKey secretkey = factory.generateSecret(keySpec);
    byte[] key = secretkey.getEncoded();

    // Using key

    // Destroy key
    Arrays.fill(key, (byte)0);

    // Destroy secretKey
    secretkey.destroy();  // --> Throw DestroyFailedException

} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

我在 Mac 上使用 Oracle JDK1.8.0_66。

我查看了 SecretKey 源代码,发现了这个默认实现(SecretKey 实现了 Destroyable 接口)

public default void destroy() throws DestroyFailedException {
    throw new DestroyFailedException();
}
Run Code Online (Sandbox Code Playgroud)

这意味着:SecretKey 的实现不会覆盖 destroy 方法来销毁内部密码字符和内部密钥字节。

这是 JDK 8 中的错误吗?

Bra*_*ery 5

你是对的。该PBKDF2KeyImpl类不实现从销毁的继承destroy方法。看起来你也不是第一个被这个问题所关注的人

这不一定是 JDK 中的错误,因为SecretKey的 API明确地将它留给实现类来定义此行为,尽管此行为未被覆盖似乎有点奇怪。