1

私は Java キー ストアを実装していますが、オーバーライドできるメソッドの 1 つは ですKeyStoreSpi.engineStore(KeyStore.LoadStoreParameter param)。これは、指定されたパラメーターに基づいてキー ストアを格納することになっています。

次の 2 つの理由から、このメソッドの実装方法がわかりません。

  1. どうやらparamnullになる可能性があります。この場合、クラスはデータの保存場所をどのように知るのでしょうか?

  2. が nullでないと仮定paramすると、出力位置情報はまだ提供されません。引数はのLoadStoreParameter緩やかなラッパーProtectionParameterであり、パスワード情報へのアクセスのみを提供しているようです。繰り返しますが、このキーストアをどこに保存するかについては何もありません。

これを実装する方法について何か提案はありますか? 私は、このメソッドをオーバーライドせず、スローするデフォルトの実装に依存する方向に傾いていますUnsupportedOperationException。しかし、それは単に問題を回避しているだけです。

キーストアのソースファイルの例として「 extends KeyStoreSpi 」をグーグルで検索してみましたが、誰もこの方法を実装していないようです。何か理由がありそうな気もしますが…

4

1 に答える 1

2

KeyStore.engineStore(KeyStore.LoadStoreParameter)およびKeyStoreSpi.engineLoad(KeyStore.LoadStoreParameter)は、キーストアの形式が単一のファイルに基づいていない場合にのみ必要です。たとえば、キーストア自体がディレクトリであり、エントリがそのディレクトリ内の個々のファイルです。

キーストア形式が単一のファイルの場合、ストリーム ベースのバージョンのengineStore/engineLoadで通常は十分であり、param ベースのバージョンを上書きする必要はありません。

キーストアは実際には単一のファイルとして表すことができないため、ストリームベースの API を使用してキーストアをロードまたは保存できないと仮定します。

  1. UnsupportedOperationExceptionメソッドからスローKeyStore.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 に答える