2016-03-01 119 views
7

在Java加密库中,有两个不同的密钥表示 - KeyKeySpec。文档暗示两者之间存在差异 - 一个KeySpec是“透明的”(无论这意味着什么),但没有方法,而Key有一个getEncoded方法。您打算使用KeyFactory在两者之间进行转换(并且确实已获得getKeySpec转换方法)。Key和KeySpec有什么区别?

然而,SecretKeySpec实现KeyKeySpec!但也有一个SecretKeyFactory类,它不会继承关闭KeyFactory

这一切都让我彻底困惑。 KeyKeySpec之间有什么不同?SecretKeySpecSecretKeyFactory是如何进入的?

回答

3

透明这里意味着所有的类/接口实现/延长KeySpec接口都应该揭示的关键元数据,以提供独立的方式。这个元数据实际上并不用于密钥的常见用途(加密等),而只在需要查看密钥的数学属性时才使用。例如,如果您想从/向字节流生成密钥,如果密钥位于HSM上,或者发现密钥是否弱,如:

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

无论您想要公开关于密钥的元数据都取决于您。 KeySpec只是用作标记界面(标记界面设计模式)。

至于反对这种可能的自省与KeySpec,使用SecretKeyFactory生成的密钥是“不透明”,因为你不能得到数学(模数,指数编码等)以及其它感(如果提供如上面的DESKeySpec)关于密钥的元数据。

在另一方面SecretKeySpec是JCE的出用于从字节流键框溶液,因此,同时实现了KeyKeySpec - 生成使用提供KeySpec密钥,使密钥可用使用Key.getEncoded()

2

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

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

密钥的透明表示意味着您可以通过相应规范类中定义的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). 

如果密钥被存储在硬件设备上,其说明书可以包含有助于识别在device.This表示的键是对比不透明表示,通过键接口所定义的信息,在其中无法直接访问关键材料字段。换句话说,“不透明”表示使您能够有限地访问密钥 - 只有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类可用于即,按键和KeySpecs之间不透明和透明键表示之间进行转换。

参考,并提供更多的细节: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeySpecs

相关问题