2

対称鍵暗号化を実現するために AES を使用しています。パスワードで保護されたキーストアにキーを保存します。

API は、キーストアからキーをロードするために以下を公開します

keyStore.load(inputStream, keyStorePassword.toCharArray()); 

そのため、暗号化または復号化するたびに、コンテンツを毎回新たに読み取らなければならないため、少なくとも私の意見ではパフォーマンスが低下する入力ストリームを渡す必要があります。

それをメモリに保存し、それからアクセスしてInputStreamに変換する戦略を手伝ってくれませんか?

注: キーストアの内容を文字列(UTF-8)に読み取って、それをInputStreamに変換してAPIに渡しようとしましたが、次の例外を吐き出しました

java.io.IOException: 無効なキーストア形式です

4

2 に答える 2

3

KeyStore は何らかのバイナリ形式です。UTF-8 文字列に変換してもダメです。ByteArrayInputStreamバイトバッファを使用する を使用できます。

しかし私の意見では、パフォーマンスの最適化に関しては考慮されません。これが実際にパフォーマンスに影響を与えるかどうかを確認するには、プロファイリングを行う必要があります。すべきではないからです。オペレーティング システムもキャッシュを行い、その間に変更がなければ、ディスクから同じファイルを何度も読み取ることはおそらくないでしょう。プログラマーは通常、プログラムのどの部分がパフォーマンスを浪費し、どの部分がそうでないかを判断するのが非常に苦手です。

また、パスワードが通常char配列を介して提供されるのには理由があります。配列の内容を完全に制御でき、不要になったら消去できます。パスワードはできるだけ短くメモリに保持する必要があります。単純な文字列ではそのような制御はできません (いつガベージ コレクションされるかわかりません)。

于 2010-08-18T09:39:51.667 に答える
0

回答ありがとうございます。私はすべて、以下の代替案に賛成です。

キーストアを一度ロードしてSecretKeyを抽出し、使用しているクラスのインスタンスまたはクラス変数に割り当ててから、暗号化または復号化が必要なときはいつでもSecretKeyを使用します

于 2010-08-18T11:27:43.630 に答える