我正在编写一个函数来使用 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 中的错误吗?
你是对的。该PBKDF2KeyImpl类不实现从销毁的继承destroy方法。看起来你也不是第一个被这个问题所关注的人。
这不一定是 JDK 中的错误,因为SecretKey的 API明确地将它留给实现类来定义此行为,尽管此行为未被覆盖似乎有点奇怪。
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |