Java chiffrement asymétrique: la meilleure façon de stocker les clés privée/publique
Ce code génère une paire de clés publique/privée:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair keypair = keyGen.genKeyPair();
PrivateKey privateKey = keypair.getPrivate();
PublicKey publicKey = keypair.getPublic();
Ce que j'aimerais savoir, c'est comment avez-vous l'habitude de stocker la clé publique:
Option 1: stocker les octets
byte[] privateKeyBytes = privateKey.getEncoded();
byte[] publicKeyBytes = publicKey.getEncoded();
//... write to file
//convert bytes back to public/private keys
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
Ce que je n'aime pas, c'est de lier le code des implémentations concrètes telles que PKCS8EncodedKeySpec
et X509EncodedKeySpec
.
Option 2: stocker le module et l'exposant
KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(publicKey, RSAPublicKeySpec.class);
RSAPrivateKeySpec priv = fact.getKeySpec(privateKey,RSAPrivateKeySpec.class);
//store modulus and exponent as BigIntegers
BigInteger modulus = pub.getModulus());
BigInteger exponent = pub.getPublicExponent());
//... write to file
//recreate public key (the same applies to the private key)
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(keySpec);
La deuxième option est plus facile à mettre en œuvre, mais je ne sais pas si cela peut être moins performant.
Tout conseiller ?
OriginalL'auteur Guido | 2010-08-09
Vous devez vous connecter pour publier un commentaire.
Dans nos applications, nous magasin de clés publiques et privées dans DER format, de sorte qu'ils peuvent être utilisés et manipulés de l'extérieur de java plus facilement. Dans notre cas, les clés privées n'ont pas de mots de passe.
Pour convertir la clé privée de quelque chose de plus facilement utilisable en java:
Ensuite, vous pouvez obtenir une clé privée RSA directement par:
La clé publique est similaire:
et de le lire:
Beaucoup de gens stocker des fichiers de clés. Pour nos fins, nous avons besoin de la même clé pour être partagée entre plusieurs applications en plusieurs langues différentes, et je ne voulais pas de dupliquer les fichiers sur le disque.
Dans les deux cas, la performance ne devrait pas être un gros souci, car vous êtes susceptible de stocker ces touches dans une sorte de Singleton ou de cache au lieu de les régénérer à chaque fois.
Pour ceux qui cherchent à obtenir
public.der
directement à partir deid_rsa.pub
(public key) au lieu deid_rsa
(clé privée) cette réponse fournit un moyen de le faire.OriginalL'auteur Brian M. Carr
Vous êtes réellement stocker les octets dans les deux cas, que vous le réalisiez ou non. Je suppose que la réponse correcte est fait allusion dans @Brian M. Carr réponse, qui consiste à stocker l'objet de niveau supérieur dans sa forme la plus naturelle. Dans le cas de clés publiques, les choix évidents sont comme un fichier PKCS#1 RSAPublicKey ASN.1 structure, DER encodé, ou comme un X509 SubjectPublicKeyInfo ASN.1 structure, encodé DER. Ce dernier est ce que le Soleil les fournisseurs de vous donner, que le soleil est de classe X509EncodedKeySpec prend en charge. De même, la PKCS8EncodedKeySpec prend en charge une clé privée au format. Ces deux formats sont standards, et sont pris en charge par openssl par exemple. Le soleil tend -- tendance 🙁 -- pour soutenir les normes existantes, plutôt que de définir leurs propres.
OriginalL'auteur James K Polk
Si vous souhaitez définir un format de stockage de la clé, puis je choisis un format qui est facile à remplacer, afin de ne pas casser lorsque vous souhaitez modifier le cryptage (lorsque l'ancien devient faible par exemple).
Donc, je voudrais stocker les octets codés en base64, avec une chaîne qui décrit le format, "rsa", peut-être.
OriginalL'auteur Alexander Kjäll