如何实现KeyStoreSpi.store(KeyStore.LoadStoreParameter param)?

时间:2014-04-09 09:09:56

标签: java cryptography keystore jce jca

我实现了一个Java密钥库,我可以覆盖的方法之一是KeyStoreSpi.engineStore(KeyStore.LoadStoreParameter param),它应该根据提供的参数存储密钥库。

我不了解如何实施此方法,原因有两个:

  1. 显然param可以为空。在这种情况下,我的班级如何知道存储数据的位置?

  2. 假设param不为空 - 它仍然没有提供任何输出位置信息。 LoadStoreParameter参数是ProtectionParameter的松散包装,它似乎只提供对密码信息的访问。同样,没有关于存储此密钥库的位置。

  3. 有关如何解决此问题的任何建议?我倾向于不重写此方法并依赖于抛出UnsupportedOperationException的默认实现。但这只是避免了这个问题。

    我已经尝试使用Google搜索" 扩展了KeyStoreSpi "有关密钥库源文件的示例,但似乎没有人实现此方法。我想这可能有原因...

1 个答案:

答案 0 :(得分:2)

仅当密钥库格式不基于单个文件时才真正需要KeyStore.engineStore(KeyStore.LoadStoreParameter)KeyStoreSpi.engineLoad(KeyStore.LoadStoreParameter),例如密钥库本身是一个目录,条目是该目录中的单个文件。

当密钥库格式是单个文件时,engineStore / engineLoad的基于流的版本通常就足够了,并且不需要覆盖基于param的版本。

假设密钥库确实无法表示为单个文件,因此无法使用基于流的API加载或保存密钥库:

  1. 从[{1}}和UnsupportedOperationException方法中投掷KeyStore.engineStore(OutputStream,char[])
  2. 创建KeyStore.engineStore(InputStream,char[]),其中包含存储或加载密钥库所需的所有信息,例如上面示例的目录路径,密码等。使其不可变是一件非常好的事情。您的密钥库实现甚至可以定义密钥库的class MyLoadStoreParameter implements KeyStore.LoadStoreParameter的多个变体具有多个外部表示。
  3. 相应地实施LoadStoreParameterKeyStore.engineStore(KeyStore.LoadStoreParameter)
  4. KeyStoreSpi.engineLoad(KeyStore.LoadStoreParameter)参数不是IllegalArgumentException的实例时,您应该抛出KeyStore.LoadStoreParameter。当参数为MyLoadStoreParameter时,这将自动覆盖。

    检查参数类型并进行转换后,您只需使用参数中包含的信息继续编写或读取特定外部表示中的密钥库。