Moyen facile de sauvegarder/restaurer la clé de chiffrement pour le décryptage de chaîne de caractères en java
Pour le chiffrement-je utiliser quelque chose comme ceci:
SecretKey aesKey = KeyGenerator.getInstance("AES").generateKey();
StringEncrypter aesEncrypt = new StringEncrypter(aesKey, aesKey.getAlgorithm());
String aesEncrypted= aesEncrypt.encrypt(StringContent);
Si j'ai imprimer aesKey je reçois: "javax.crypto.spec.SecretKeySpec@1708d".
Donc pour le cryptage, je voudrais demander à l'utilisateur de clé, mais ne savent pas comment et sous quel format doit-elle être.
Mon plan était quelque chose comme ceci:
SecretKey aesKey = javax.crypto.spec.SecretKeySpec@1708d;
StringEncrypter aesEncrypt = new StringEncrypter(aesKey, aesKey.getAlgorithm());
String aesDecrypt = aesEncrypt.decrypt(aesEncrypted);
Mais il semble que sa ne fonctionne pas. Est-il un moyen facile d'imprimer la clé après le cryptage de la console de sorte que l'utilisateur peut enregistrer(ou de rappeler) et ensuite l'Utiliser pour le Décryptage ?
Tout le code est ici:Il ne peut pas déchiffrer cyphertext de fichier texte, clé symétrique mettre en œuvre. en java
Donc, je suis désolé de poster à nouveau, mais je ne sais pas Si le code est encore lisible(je suis novice).
OriginalL'auteur dave91 | 2009-12-17
Vous devez vous connecter pour publier un commentaire.
J'ai dû le faire moi-même récemment. Et tandis que les autres réponses ici m'a conduit dans la bonne direction, il aurait été plus facile. Voici donc mon "partager" pour la journée, un couple de méthodes d'assistance pour la simple clé AES de manipulation. (Note de la dépendance sur Apache Commons et le Codec.)
C'est tout dans un repo git maintenant: github.com/stuinzuri/SimpleJavaKeyStore
getEncoded()
a entraîné des octets nuls ou si le premier octet est le bit le plus élevé ensemble?Fixe, merci pour remarquer qu'.
je suis un fan de la statique des fonctions utilitaires et statique importations 🙂
OriginalL'auteur Stu Thompson
Plus Java
Key
instances sont représentées comme une chaîne d'octets résultant de leurgetEncoded()
méthode. C'est ce qui doit être stockée dans le but de reconstruire la clé plus tard.Cependant, pour stocker une clé en toute sécurité sous forme électronique, il doit être chiffré. Bien sûr, le cryptage de la clé, il faudrait une clé (ou mot de passe)... et si vous avez une régression à l'infini. Java
KeyStore
peut être utilisé pour stockerSecretKey
objets de cette manière, et qui est utile lorsque vous avez plusieurs clés secrètes qui sont tous protégés par un seul "maître" de mot de passe. Mais pour protéger une seule touche, il ne fait pas beaucoup de sens.Une alternative est de présenter la clé de l'utilisateur dans un formulaire qui peut être stocké dans un coffre-fort (dans de nombreuses applications, qui pourraient être sur un bout de papier dans son portefeuille). Cela pourrait être aussi simple que d'afficher les octets de la clé codée en hexadécimal, en Base 64, ou d'autres de codage de texte, et demandant à l'utilisateur d'écrire.
Une autre approche est de permettre à l'utilisateur de choisir un mémorable mot de passe, et de générer une clé avec qui, à l'aide d'un algorithme de type PBKDF2. Le sel (et peut-être le nombre d'itérations) utilisé pour la dérivation de clé devra être enregistré quelque part. Un autre inconvénient est que les gens ont tendance à choisir à partir d'un nombre relativement limité de mots de passe sur un total disponible. Donc les clés dérivées à partir de mots de passe peut être plus facile de deviner que la taille de la clé suggère.
Voici une illustration de la technique de base pour la persistance et la reconstitution d'une clé secrète.
Je vois incompatible lit avec la nouvelle BigInteger(entrée, 16).toByteArray() partie de ce code. Le plus souvent sa lecture en 17bytes et de me donner un "invalide aes longueur de la clé: 17 octets' erreur lorsque j'essaie de l'utiliser. Ce qui peut provoquer cela?
si le bit élevé de la valeur de la clé,
BigInteger
va ajouter un zéro octet de début du tableau d'octets pour l'empêcher d'être interprétée comme un nombre négatif. Peut-être, au lieu denew BigInteger(1, encoded)
, vous devriez permettre à la chaîne d'être un nombre négatif:new BigInteger(encoded)
Maintenant que le soutien de base-64 est intégré, je recommande.
OriginalL'auteur erickson
J'ai des clés stockées dans le keystore java fichiers. Voici un article qui peut vous aider
http://www.informit.com/articles/article.aspx?p=170967&seqNum=3
OriginalL'auteur BillMan
Juste pour la référence, le format de sortie que vous voyez est le résultat de la valeur par défaut
toString
de la méthode et de la drôle de numéro sur la fin est un code de hachage. Voir ici. Des codes de hachage sont pas réversibles, ettoString
n'est pas nécessairement garanti pour vous donner suffisamment d'informations pour reconstruire l'objet d'origine (bien que pour certaines classes).OriginalL'auteur Dan