在Java密码库中, key 有两种不同的表示形式 Key KeySpec 。文档暗示两者之间存在差异-KeySpec是“透明的”(无论什么意思),但没有方法,而Key具有getEncoded方法。您应该使用 KeyFactory 在两者之间进行转换(并且确实有一个getKeySpec方法可以进行转换)。

但是,SecretKeySpec同时实现KeyKeySpec!但是也有一个SecretKeyFactory类,它不继承KeyFactory

这一切使我彻底困惑。 KeyKeySpec之间有什么区别,SecretKeySpecSecretKeyFactory如何进入其中?

最佳答案

这里透明的意思是所有实现/扩展KeySpec接口(interface)的类/接口(interface)都应该以与提供者无关的方式显示有关 key 的元数据。实际上,该元数据从不实际用于 key 的一般用途(加密等),仅在需要查看 key 的数学属性时才使用。例如,如果您想从字节流生成字节流或向字节流生成 key ,如果该 key 驻留在HSM上,则 Hook 该 key ,甚至找出某个 key 是否弱,例如:

DESKeySpec.isWeak(byte[] key, int offset)

无论您想公开有关 key 的任何元数据,都取决于您自己。 KeySpec仅充当标记接口(interface)(标记接口(interface)设计模式)。

KeySpec可能进行的内省(introspection)相反,使用SecretKeyFactory生成的键是“不透明的”,这意味着您无法获得完整的数学(模量,指数,编码等)和其他(如果像上面的DESKeySpec这样提供)有关 key 的元数据。

另一方面,SecretKeySpec是JCE的开箱即用的解决方案,用于从字节流生成 key ,因此它实现了KeyKeySpec两者-使用提供的KeySpec生成 key ,并使用Key.getEncoded()使 key 可用。

09-28 05:15