1

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

我不明白如何实现此方法,原因有两个:

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

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

关于如何解决这个问题的任何建议?我倾向于不覆盖此方法并依赖默认实现,它会抛出UnsupportedOperationException. 但这只是在回避问题。

我已经尝试在谷歌上搜索“ extend KeyStoreSpi ”以获取密钥存储源文件的示例,但似乎没有人实现此方法。我想这可能是有原因的...

4

1 回答 1

2

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

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

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

  1. UnsupportedOperationExceptionKeyStore.engineStore(OutputStream,char[])KeyStore.engineStore(InputStream,char[])方法中抛出。
  2. 创建class MyLoadStoreParameter implements KeyStore.LoadStoreParameter将包含存储或加载密钥库所需的所有信息,例如上面示例的目录路径、密码等。使其不可变显然是一件好事。您的密钥库实现甚至可以定义密钥库的多个变体,LoadStoreParameter具有多个外部表示。
  3. KeyStore.engineStore(KeyStore.LoadStoreParameter)相应地实施KeyStoreSpi.engineLoad(KeyStore.LoadStoreParameter)

当参数不是IllegalArgumentException. 这将自动覆盖参数为 的情况。KeyStore.LoadStoreParameterMyLoadStoreParameternull

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

于 2014-04-09T10:19:31.220 回答