java密钥和密钥规范之间有什么区别?
在Java加密库中,密钥有两种不同的表示形式^{KeySpec
是“透明的”(不管这意味着什么),但没有方法,而Key
有一个getEncoded
方法。您需要使用^{getKeySpec
方法进行转换)
然而,SecretKeySpec
同时实现了Key
和KeySpec
!但是也有一个SecretKeyFactory
类,它不继承KeyFactory
这一切让我彻底糊涂了。a Key
和a KeySpec
之间有什么不同,SecretKeySpec
和SecretKeyFactory
是如何形成的
# 1 楼答案
这里的透明意味着实现/扩展
KeySpec
接口的所有类/接口都应该以独立于提供者的方式显示有关密钥的元数据。这种元数据实际上从未用于密钥的常见用途(加密等),但仅在需要研究密钥的数学属性时使用。了解此类与提供者无关的密钥数据可能很有用,例如,如果您想从字节流生成密钥,如果密钥位于HSM上,则将其挂接,甚至可以查明密钥是否弱,如:关于密钥的任何元数据都由您决定
KeySpec
只是作为一个标记接口(标记接口设计模式)与
KeySpec
的这种可能的自省相反,使用SecretKeyFactory
生成的密钥是“不透明的”,从这个意义上说,您无法获得有关密钥的完整的数学(模、指数、编码等)和其他(如果像上面的DESKeySpec
那样提供)元数据另一方面,
SecretKeySpec
是JCE的现成解决方案,用于从字节流生成密钥,因此它实现了Key
和KeySpec
——使用提供的KeySpec
生成密钥,并使用Key.getEncoded()
使密钥可用