Key和KeySpec之间有什么区别?

the*_*oop 9 java cryptography javax.crypto

在Java加密库中,键有两种不同的表示形式 - KeyKeySpec.文档暗示两者之间存在差异 - 一个KeySpec是'透明'(无论这意味着什么),但没有方法,而Key有一个getEncoded方法.你打算使用a KeyFactory来转换它们(它确实有一个getKeySpec转换方法).

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

这一切让我彻底迷茫.什么是之间的不同KeyKeySpec,以及如何做SecretKeySpec,并SecretKeyFactory进入呢?

小智 5

这里的透明意味着实现/扩展KeySpec接口的所有类/接口都应该以独立于提供者的方式显示关于密钥的元数据.该元数据实际上从未在密钥的常见使用中实际使用(加密等),但仅在需要查看密钥的数学属性时使用.了解有关密钥的此类提供程序独立数据可能很有用,例如,如果要从/向字节流生成密钥,在密钥驻留在HSM上时挂钩密钥,或者甚至找出密钥是否弱,如:

DESKeySpec.isWeak(byte[] key, int offset)
Run Code Online (Sandbox Code Playgroud)

无论您希望公开关于密钥的元数据都取决于您.KeySpec只是作为标记界面(标记界面设计模式).

与使用的这种可能的内省相反,KeySpec使用生成的密钥SecretKeyFactory是"不透明的",在某种意义上,您无法获得关于密钥的完整数学(模数,指数,编码等)和其他(如果提供DESKeySpec如上所述)元数据.

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