Estoy buscando una forma de encriptar una contraseña en un archivo de configuración que está siendo leído por un programa Java. Actualmente, leo en la contraseña desde el archivo de texto, pero deja abierta la contraseña al a la vista si alguien mira el archivo de configuración.cifrar y descifrar el valor del archivo de propiedad en java
Estaba pensando en crear una clase simple donde el usuario pudiera escribir la contraseña deseada, obtener una versión encriptada de la contraseña, luego pegar la versión encriptada en el archivo de texto de configuración. Luego, la aplicación leerá la contraseña cifrada, descifrará la contraseña en una cadena y continuará.
Tengo problemas con la cadena -> bytes cifrados -> cadena conversiones.
Estoy utilizando las clases de seguridad incorporadas de Java para implementar este código. Aquí hay un código de prueba de ejemplo:
// 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
Cualquier ayuda en el error, estructura o proceso que estoy utilizando para ello sería grande. Gracias.
Si su aplicación está en la máquina del cliente, se puede descifrar y descubrir la clave de descifrado. Una vez que eso sucede, también puede estar utilizando texto plano. La única manera de asegurar realmente ese flujo de trabajo es hacer que la descifrado tenga lugar en un servidor seguro. ¿Qué problema estás tratando de resolver que te llevó a probar esto? (¿Por qué necesita almacenar una contraseña como esa?) – Daenyth
No quise almacenar la contraseña en el archivo de configuración como texto sin formato. – user234194
@ user234194: Te estás perdiendo el punto. Si almacena la clave de descifrado en el cliente, no es segura y cualquiera puede descifrarla con el cliente. – Daenyth