有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java密钥和密钥规范之间有什么区别?

在Java加密库中,密钥有两种不同的表示形式^{}^{}。这些文件暗示这两种方法之间存在差异——a KeySpec是“透明的”(不管这意味着什么),但没有方法,而Key有一个getEncoded方法。您需要使用^{}在两者之间进行转换(它确实有一个getKeySpec方法进行转换)

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

这一切让我彻底糊涂了。a Key和a KeySpec之间有什么不同,SecretKeySpecSecretKeyFactory是如何形成的


共 (1) 个答案

  1. # 1 楼答案

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

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

    关于密钥的任何元数据都由您决定KeySpec只是作为一个标记接口(标记接口设计模式)

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

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