2010-08-18 6 views
2

J'utilise AES pour effectuer le chiffrement par clé symétrique. Je stocke la clé dans un KeyStore protégé par mot de passe.Cache le contenu de KeyStore et le convertit en InputStream

l'api expose ce qui suit pour charger la clé de keystore

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

donc à chaque fois quand je veux enrypt ou décrypter, je dois passer le InputStream qui est atleast à mon avis, un coup de performance car il a pour lire le contenu à chaque fois.

Pourriez-vous m'aider avec la stratégie de le stocker dans la mémoire et à partir de là l'accès et la conversion à un InputStream?

Note: j'ai essayé de lire le contenu du fichier de clés à la chaîne (UTF-8) et le convertir en InputStream et passé à l'api .Mais cracher à la suite exception

java.io.IOException: forme non valide keystore

Répondre

0

Merci pour les réponses. Je suis tout pour l'alternative ci-dessous.

Je chargerait le keystore une fois et extraire le SecretKey et assigner à une variable d'instance ou de classe de la classe que vous utilisez et puis utilisez la SecretKey chaque fois qu'un besoin pour chiffrer ou déchiffrer

+1

Eh bien, puisque j'ai trouvé une solution, je l'ai posté. Je ne vois pas de mal, ni je ne vois aucune partie de mon message enfreignant les règles de stackoverflow. – Sudhakar

3

Le keyStore est dans un format binaire. Le convertir en une chaîne UTF-8 n'est pas bon. Vous pouvez utiliser un ByteArrayInputStream qui utilise un tampon d'octets.

Mais: à mon avis ne compte pas quand il s'agit d'optimisation des performances. Vous devriez faire un profilage pour vérifier si cela a vraiment un impact sur les performances. Parce que ça ne devrait pas. Le système d'exploitation met également en cache et probablement ne lira pas le même fichier à partir du disque encore et encore si elle n'a pas changé entre-temps. Les programmeurs sont généralement extrêmement mal à juger quelles parties d'un programme sont des porcs de performance et qui ne le sont pas.

En outre: Il y a une raison pour laquelle les mots de passe sont généralement fournis via char tableaux: Vous avez un contrôle total sur le contenu de la matrice et pouvez l'effacer une fois que ce n'est plus nécessaire. Le mot de passe doit rester en mémoire le plus court possible. Vous n'avez pas ce genre de contrôle avec des chaînes simples (vous ne savez pas quand ils sont collectés).

+0

+1. Cela ressemble vraiment à une optimisation prématurée par l'OP, et ce n'est vraiment pas une bonne idée de maintenir un cache du contenu du keystore. –

Questions connexes