Chiffrer et déchiffrer la valeur du fichier de propriétés dans Java
Je suis à la recherche d'un moyen de crypter un mot de passe dans un fichier de configuration
qui est lu par un programme Java. Actuellement, j'ai lu dans le
mot de passe à partir du fichier texte, mais qui laisse le mot de passe assis à droite
dehors dans l'ouvert si quelqu'un a été à regarder le fichier de configuration.
Je pensais à la construction d'une classe simple où l'utilisateur peut taper
leur mot de passe souhaité, obtenir une version chiffrée du mot de passe, puis
coller la version crypté dans le fichier texte de configuration. Puis le
demande de lire le mot de passe crypté, de déchiffrer le mot de passe
dans une chaîne, et d'avancer.
Je vais avoir des ennuis avec la chaîne-->encrytped octets-->string
les conversions.
Je suis en utilisant le construit en java classes de sécurité à mettre en œuvre ce code.
Voici quelques exemples de code de test:
//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=[B@2a4983
When I run the code, I get the following output:
password: passwd
encrypted: [B@2a4983
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, de la structure ou processus, je suis en utilisant pour ce faire
serait génial. Merci.
source d'informationauteur user234194
Vous devez vous connecter pour publier un commentaire.
Vraiment une solution simple serait d'utiliser un encodage Base64, voir l'extrait de code ci-dessous :-
Prendre un coup d'oeil à Jasypt. Il a déjà fait tout le levage lourd pour vous. Plus précisément, le
org.jasypt.encryption.pbe.StandardPBEStringEncryptor
etorg.jasypt.properties.PropertyValueEncryptionUtils
classes.Créer un crypteur:
Ensuite utiliser
PropertyValueEncryptionUtils
pour crypter /décrypter les valeurs:Note la valeur codée va commencer avec
ENC(
et à la fin avec)
de sorte qu'il est facile de dire si une propriété à partir d'un fichier est crypté.Aussi, notez que le mot de passe utilisé pour
config.setPassword()
est pas le mot de passe de codage pour stocker dans le fichier de propriétés. Au lieu de cela, c'est le mot de passe pour crypter /décrypter la valeur vous les rangez. Ce que ce mot de passe est et comment les définir, il est à vous. J'ai par défaut le nom de classe entièrement qualifié de tout ce qui est de la lecture du fichier de Propriétés.Enfin, si vous utilisez le Printemps, Jasypt a un
EncryptablePropertyPlaceholderConfigurer
de classe que vous pouvez utiliser pour charger le fichier de propriétés et l'utilisation${foo}
de syntaxe dans votre Printemps des fichiers XML pour faire de la substitution de variable pour des choses comme les DB des mots de passe.Voici quelques aides pour crypter ou décrypter à l'aide de l'algorithme AES en Java:
Il suffit d'appeler la méthode appropriée.
J'avais des trucs du tableau d'octets, par le biais d'un base64 fr/décodeur, de cette façon, vous aurez à persister chaînes qui contiennent rien, mais les caractères à l'intérieur (un sous-ensemble de) ASCII, ce qui devrait limiter votre problème. Jetez un oeil par exemple à communes codecs et de remplacer votre
new String(decrypted)
avec un appel à l'une des méthodes statiques dans laorg.apache.commons.codec.binary.Base64
classe.D'ailleurs que je pense que ce que vous voulez finalement faire n'est pas strictement de "chiffrer" le mot de passe, mais plutôt de stocker qu'un hachage du mot de passe, ce qui a déjà été discuté sur DONC.