我实现了一个Java密钥库,我可以覆盖的方法之一是KeyStoreSpi.engineStore(KeyStore.LoadStoreParameter param)
,它应该根据提供的参数存储密钥库。
我不了解如何实施此方法,原因有两个:
显然param
可以为空。在这种情况下,我的班级如何知道存储数据的位置?
假设param
不为空 - 它仍然没有提供任何输出位置信息。 LoadStoreParameter
参数是ProtectionParameter
的松散包装,它似乎只提供对密码信息的访问。同样,没有关于存储此密钥库的位置。
有关如何解决此问题的任何建议?我倾向于不重写此方法并依赖于抛出UnsupportedOperationException
的默认实现。但这只是避免了这个问题。
我已经尝试使用Google搜索" 扩展了KeyStoreSpi "有关密钥库源文件的示例,但似乎没有人实现此方法。我想这可能有原因...
答案 0 :(得分:2)
仅当密钥库格式不基于单个文件时才真正需要KeyStore.engineStore(KeyStore.LoadStoreParameter)
和KeyStoreSpi.engineLoad(KeyStore.LoadStoreParameter)
,例如密钥库本身是一个目录,条目是该目录中的单个文件。
当密钥库格式是单个文件时,engineStore
/ engineLoad
的基于流的版本通常就足够了,并且不需要覆盖基于param的版本。
假设密钥库确实无法表示为单个文件,因此无法使用基于流的API加载或保存密钥库:
UnsupportedOperationException
方法中投掷KeyStore.engineStore(OutputStream,char[])
。KeyStore.engineStore(InputStream,char[])
,其中包含存储或加载密钥库所需的所有信息,例如上面示例的目录路径,密码等。使其不可变是一件非常好的事情。您的密钥库实现甚至可以定义密钥库的class MyLoadStoreParameter implements KeyStore.LoadStoreParameter
的多个变体具有多个外部表示。LoadStoreParameter
和KeyStore.engineStore(KeyStore.LoadStoreParameter)
。当KeyStoreSpi.engineLoad(KeyStore.LoadStoreParameter)
参数不是IllegalArgumentException
的实例时,您应该抛出KeyStore.LoadStoreParameter
。当参数为MyLoadStoreParameter
时,这将自动覆盖。
检查参数类型并进行转换后,您只需使用参数中包含的信息继续编写或读取特定外部表示中的密钥库。