在Java密码库中, key 有两种不同的表示形式 Key
和 KeySpec
。文档暗示两者之间存在差异-KeySpec
是“透明的”(无论什么意思),但没有方法,而Key
具有getEncoded
方法。您应该使用 KeyFactory
在两者之间进行转换(并且确实有一个getKeySpec
方法可以进行转换)。
但是,SecretKeySpec
同时实现Key
和KeySpec
!但是也有一个SecretKeyFactory
类,它不继承KeyFactory
。
这一切使我彻底困惑。 Key
和KeySpec
之间有什么区别,SecretKeySpec
和SecretKeyFactory
如何进入其中?
最佳答案
这里透明的意思是所有实现/扩展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 ,因此它实现了Key
和KeySpec
两者-使用提供的KeySpec
生成 key ,并使用Key.getEncoded()
使 key 可用。