13

在 Java 加密库中,密钥有两种不同的表示形式 -KeyKeySpec. 文档暗示两者之间存在差异 - aKeySpec是“透明的”(无论这意味着什么),但没有方法,而KeygetEncoded方法。您打算使用 aKeyFactory在两者之间进行转换(它确实有一种getKeySpec转换方法)。

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

这一切让我彻底迷茫了。Keya和 a之间有什么区别,以及KeySpec如何进入它?SecretKeySpecSecretKeyFactory

4

2 回答 2

5

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

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

无论您想公开什么有关密钥的元数据都由您决定。KeySpec只是充当标记接口(标记接口设计模式)。

与这种可能的自省相反,KeySpec使用生成的密钥SecretKeyFactory是“不透明的”,因为您无法获得关于密钥的完整数学(模数、指数、编码等)和其他(如果像DESKeySpec上面那样提供)元数据。

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

于 2016-03-01T19:49:27.570 回答
4

密钥对象和密钥规范(KeySpecs)是密钥数据的两种不同表示。

密码使用 Key 对象来初始化其加密算法,但可能需要将密钥转换为更便携的格式以进行传输或存储。

键的透明表示意味着您可以通过相应规范类中定义的一种 get 方法单独访问每个键材料值。

For example, DSAPrivateKeySpec defines getX, getP, getQ, and getG methods, to access the private key x, and the DSA algorithm parameters used to calculate the key(the prime p, the sub-prime q, and the base g). 

如果密钥存储在硬件设备上,则其规范可能包含有助于识别设备上密钥的信息。这种表示与 Key 接口定义的不透明表示形成对比,在这种表示中您无法直接访问密钥材料领域。换句话说,“不透明”表示使您可以有限地访问密钥——只有 Key 接口定义的三个方法:getAlgorithm、getFormat 和 getEncoded。

可以以特定于算法的方式或以与算法无关的编码格式(例如 ASN.1)来指定密钥。

For example, a DSA private key may be specified by its components x, p, q, and g (eg: DSAPrivateKeySpec), or it may be specified using its DER encoding (eg: PKCS8EncodedKeySpec).

KeyFactory 和 SecretKeyFactory 类可用于在不透明和透明密钥表示之间进行转换,即在 Keys 和 KeySpecs 之间进行转换。

参考资料和更多详细信息,请访问: https ://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeySpecs

于 2016-03-01T19:19:56.553 回答