Je cherche un moyen de crypter un mot de passe dans un fichier de configuration qui est lu par un programme Java. Actuellement, j'ai lu le mot de passe à partir du fichier texte, mais cela laisse le mot de passe assis à l'air libre si quelqu'un devait regarder le fichier de configuration.crypter et décrypter la valeur du fichier de propriétés dans java
Je pensais à construire une classe simple où l'utilisateur pouvait taper le mot de passe désiré, obtenir une version cryptée du mot de passe, puis coller la version cryptée dans le fichier texte de configuration. Ensuite, l'application lirait le mot de passe crypté, décrypterait le mot de passe dans une chaîne, et passer à autre chose.
J'ai des problèmes avec la chaîne -> encrytped octets -> chaîne conversions. J'utilise les classes de sécurité java intégrées pour implémenter ce code. Voici un code de test d'échantillon:
// Reads password from config file
String password = ScriptConfig.getString("password");
// Generate Key
KeyGenerator kg = KeyGenerator.getInstance("DES");
Key key = kg.generateKey();
// Create Encryption cipher
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
// Encrypt password
byte[] encrypted = cipher.doFinal(password.getBytes());
// Create decryption cipher
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(encrypted);
// Convert byte[] to String
String decryptedString = new String(decrypted);
System.out.println("password: " + password);
System.out.println("encrypted: " + encrypted);
System.out.println("decrypted: " + decryptedString);
// Read encrypted string from config file
String encryptedPassword = ScriptConfig.getString("encryptedPassword"
);
// Convert encryptedPassword string into byte[]
byte[] encryptedPasswordBytes = new byte[1024];
encryptedPasswordBytes = encryptedPassword.getBytes();
// Decrypt encrypted password from config file
byte[] decryptedPassword = cipher.doFinal(encryptedPasswordBytes);//error here
System.out.println("encryptedPassword: " + encryptedPassword);
System.out.println("decryptedPassword: " + decryptedPassword);
The config file has the following variables:
password=password
encryptedPassword=[[email protected]
When I run the code, I get the following output:
password: passwd
encrypted: [[email protected]
decrypted: passwd
javax.crypto.IllegalBlockSizeException: Input length must be multiple
of 8 when decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.DESCipher.engineDoFinal(Da shoA12275)
at javax.crypto.Cipher.doFinal(DashoA12275)
at com.sapient.fbi.uid.TestEncryption.main(TestEncryp tion.java:4
Toute aide sur l'erreur, la structure ou un processus que je utilise pour ce faire serait génial. Merci.
Si votre application se trouve sur l'ordinateur du client, elle peut être endommagée et la clé de déchiffrement découverte. Une fois que cela arrive, vous pouvez aussi bien utiliser le texte en clair. La seule façon de vraiment sécuriser ce flux de travail est d'avoir le décryptage sur un serveur sécurisé. Quel problème essayez-vous de résoudre qui vous a amené à essayer cela? (Pourquoi avez-vous besoin de stocker un mot de passe comme ça?) – Daenyth
Je ne voulais pas stocker le mot de passe dans le fichier de configuration en texte brut. – user234194
@ user234194: Vous manquez le point. Si vous stockez la clé de déchiffrement sur le client, elle n'est pas sécurisée et peut être déchiffrée par n'importe qui avec le client. – Daenyth