La sécurisation d'un mot de passe dans un fichier de propriétés [dupliquer]

cette question a déjà une réponse ici:

j'ai une application java qui se connecte à une base de données.

Le nom d'utilisateur et le mot de passe de la base de données sont stockés dans un fichier de propriétés.

Quelle est la pratique courante pour éviter de stocker le mot de passe en clair dans le fichier de propriétés tout en conservant l'option de laisser l'utilisateur le changer?

La principale motivation ici est d'empêcher quelqu'un de regarder par-dessus l'épaule de l'administrateur et de voir le mot de passe pendant que l'administrateur édite le fichier de propriétés.

J'ai lu ici qu'il y a un construit en manière de le faire dans C#.

Connaissant java, Je ne m'attends pas à trouver une solution intégrée, mais j'aimerais savoir ce que font les autres.

Si Je ne trouve pas de bon choix, alors je vais probablement le crypter avec un mot de passe constant qui sera conservé dans le code. Mais je détesterais le faire de cette façon parce que c'est mal.

Edit 12 déc 2012 Regarde comme il n'y a pas de magie et je dois stocker le mot de passe dans le code ou quelque chose similaire. À la fin, nous avons mis en œuvre quelque chose de très similaire à ce que fait Jasypt qui a été mentionné dans l'une des réponses. Donc j'accepte la réponse de Jasypt parce que c'est la chose la plus proche d'une réponse définitive.

55
demandé sur Community 2012-04-25 02:01:32

4 réponses

enter image description here

Jasypt fournit le org.jasypt.propriété.EncryptableProperties classe pour le chargement, la gestion transparente et le décryptage des valeurs chiffrées .propriétés des fichiers, permettant le mélange de valeurs cryptées et non-cryptées dans le même fichier.

http://www.jasypt.org/encrypting-configuration.html

en utilisant un org.jasypt.propriété.Objet chiffrable properties, an l'application serait en mesure de lire correctement et utiliser un .fichier de propriétés comme ceci:

datasource.driver=com.mysql.jdbc.Driver 
datasource.url=jdbc:mysql://localhost/reportsdb 
datasource.username=reportsUser 
datasource.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm) 

noter que le mot de passe de la base de données est crypté (en fait, toute autre propriété pourrait aussi crypté, qu'il soit lié ou non à la configuration de la base de données).

Comment pouvons-nous lire cette valeur? pareil:

/*
* First, create (or ask some other component for) the adequate encryptor for   
* decrypting the values in our .properties file.   
*/  
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();     
encryptor.setPassword("jasypt"); // could be got from web, env variable...    
/*   
* Create our EncryptableProperties object and load it the usual way.   
*/  
Properties props = new EncryptableProperties(encryptor);  
props.load(new FileInputStream("/path/to/my/configuration.properties"));

/*   
* To get a non-encrypted value, we just get it with getProperty...   
*/  
String datasourceUsername = props.getProperty("datasource.username");

/*   
* ...and to get an encrypted value, we do exactly the same. Decryption will   
* be transparently performed behind the scenes.   
*/ 
String datasourcePassword = props.getProperty("datasource.password");

 // From now on, datasourcePassword equals "reports_passwd"...
41
répondu Mads Hansen 2012-04-25 01:31:53

Les pauvres mans solution de compromis consiste à utiliser une approche simpliste multi signature approche.

par exemple, le DBA définit le mot de passe de la base de données des applications à une chaîne aléatoire de 50 caractères. TAKqWskc4ncvKaJTyDcgAHq82X7tX6Gfk2fc386bmnw3muknju "151940920

il ou elle donne la moitié du mot de passe au développeur d'application qui ensuite le code dur dans le binaire java.

private String pass1 = "TAKqWskc4ncvKaJTyDcgAHq82 "

L'autre moitié du mot de passe est transmis comme argument de ligne de commande. le DBA donne pass2 au support du système ou à l'administrateur qui l'entre dans une heure de démarrage de l'application ou le met dans le script de démarrage automatisé de l'application.

java-jar / myapplication.jar-pass2 X7tX6GfK2fc386bmNw3muknjU

quand l'application démarre, elle utilise pass1 + pass2 et se connecte à la base de données.

cette solution a de nombreux avantages avec les chutes mentionnées.

vous pouvez en toute sécurité mettre la moitié du mot de passe dans une ligne de commande arguments comme la lecture il ne vous aidera pas beaucoup à moins que vous êtes le développeur qui a l'autre moitié du mot de passe.

le DBA peut encore changer la seconde moitié du mot de passe et le développeur n'a pas besoin de déployer à nouveau l'application.

le code source peut aussi être semi publique comme la lecture et le mot de passe ne vous donnera pas accès à l'application.

vous pouvez encore améliorer la situation en ajoutant des restrictions sur les plages D'adresses IP à partir desquelles la base de données Accepte les connexions.

9
répondu Abelgo Japan 2014-10-22 07:07:15

Qu'en est-il de fournir un mécanisme personnalisé D'authentification N-Facteur?

avant de combiner les méthodes disponibles, supposons que nous pouvons effectuer ce qui suit:

1 )Code dur à L'intérieur du programme Java

2) à conserver dans un entrepôt .fichier de propriétés

3) demander à l'utilisateur de taper le mot de passe de la ligne de commande

4) demander à l'utilisateur de taper un mot de passe à partir d'un formulaire

5) Demander à l'utilisateur de charger un mot de passe-fichier de la ligne de commande ou un formulaire

6 )fournir le mot de passe par le réseau

7) de nombreuses solutions de rechange (par exemple tirer un Secret, empreinte digitale, IP-specific, bla bla bla)

1ère option: nous pourrions rendre les choses plus compliquées pour un attaquant en utilisant l'obscurcissement, mais ce n'est pas considéré comme une bonne contre-mesure. Un bon codeur peut facilement comprendre comment cela fonctionne s'il / elle peut accéder au fichier. Nous pourrions même l'exportation d'un binaire par utilisateur (ou juste la partie obfuscation ou key-part), donc un attaquant doit avoir accès à ce fichier spécifique à l'Utilisateur, pas une autre distro. Encore une fois, nous devrions trouver un moyen de changer les mots de passe, par exemple en recompilant ou en utilisant la réflexion pour modifier le comportement de classe à la volée.

2e option: nous pouvons stocker le mot de passe dans le .fichier de propriétés dans un format crypté, de sorte qu'il n'est pas directement visible à partir d'un attaquant (tout comme jasypt does). Si nous avons besoin d'un gestionnaire de mots de passe, nous aurons besoin d'un mot de passe maître aussi qui devrait être stocké quelque part - à l'intérieur d'un .la classe, le fichier de magasin de clés, noyau, un autre fichier, ou même dans la mémoire - ont tous leurs avantages et leurs inconvénients.

Mais, maintenant les utilisateurs vont juste éditer le .fichier de propriétés pour le changement de mot de passe.

3ème option: tapez le mot de passe lorsque vous utilisez la ligne de commande par exemple java -jar /myprogram.jar -p sdflhjkiweHIUHIU8976hyd .

Cela ne nécessite pas que le mot de passe soit stocké et restera dans la mémoire. Cependant, les commandes history et les logs OS, peuvent être votre pire ennemi ici. Pour changer les mots de passe à la volée, vous aurez besoin de mettre en œuvre certaines méthodes (par exemple écouter les entrées de la console, RMI, sockets, REST bla bla bla), mais le mot de passe restera toujours en mémoire.

on peut même le déchiffrer temporairement seulement lorsque nécessaire -> puis supprimer le mot de passe déchiffré, mais toujours garder le mot de passe crypté dans la mémoire. Malheureusement, la méthode susmentionnée n'augmente pas la sécurité contre l'accès en mémoire non autorisé, parce que la personne qui réalise cela, aura probablement accès à l'algorithme, le sel et tous les autres secrets utilisés.

4e option: fournir le mot de passe à partir d'un formulaire personnalisé, plutôt que la ligne de commande. Cela permettra de contourner le problème de l'exposition aux diagraphies.

5e option: fournir un fichier comme mot de passe stocké précédemment sur un autre support -> puis fichier de suppression dur. Cela permettra encore une fois de contourner le problème de l'exposition de journalisation, plus aucune dactylographie est nécessaire qui pourrait être épaule surfer volé. Quand un changement est requis, fournir un autre fichier, puis supprimer à nouveau.

6ème option: encore une fois pour éviter la navigation à l'horizontale, on peut implémenter un appel de méthode RMI, pour fournir le mot de passe (par un canal crypté) à partir d'un autre appareil, par exemple via mobile. Cependant, vous devez maintenant protéger votre canal réseau et l'accès à l'autre périphérique.

je choisirais une combinaison des méthodes ci-dessus pour atteindre la sécurité maximale de sorte que l'on devrait accéder à la .les fichiers de classe, le fichier de propriétés, journaux, canal du réseau, de l'épaule du surf, de l'homme du milieu, d'autres fichiers bla bla bla. Ceci peut être facilement implémenté en utilisant une opération XOR entre tous les sub_passwords pour produire le mot de passe réel.

nous on ne peut pas protéger de l'accès non autorisé en mémoire, cependant, cela ne peut être réalisé qu'en utilisant certains matériels à accès restreint (par exemple smartcards, HSMs, SGX), où tout est calculé en eux, sans personne, même le propriétaire légitime étant en mesure d'accéder à des clés de déchiffrement ou des algorithmes. Encore une fois, on peut voler ce matériel aussi, il ya rapporté attaques sur les canaux secondaires qui peuvent aider les attaquants dans l'extraction de clés et dans certains cas, vous devez faire confiance à une autre partie (par exemple avec SGX, vous faites confiance à Intel). Bien sûr, la situation peut empirer lorsque le clonage (désassemblage) en enclave sécurisée sera possible, mais je suppose que cela prendra quelques années pour être pratique.

aussi, on peut envisager une solution de partage de clé où la clé complète est partagée entre différents serveurs. Cependant, lors de la reconstruction, la clé complète peut être volée. Le seul moyen d'atténuer la question susmentionnée est de calcul multipartisme sécurisé .

nous devrions toujours garder à l'esprit que quelle que soit la méthode d'entrée, nous devons nous assurer que nous ne sommes pas vulnérables à des attaques réseau (attaques MITM) et/ou des enregistreurs de clés.

8
répondu Konstantinos Chalkias 2017-04-13 12:48:18

en fait, c'est un duplicata du mot de passe crypté dans les fichiers de Configuration? .

la meilleure solution que j'ai trouvée jusqu'à présent est dans cette réponse: https://stackoverflow.com/a/1133815/1549977

Pros: Le mot de passe est enregistré dans un tableau A char, pas sous forme de chaîne de caractères. C'est toujours pas bon, mais mieux que toute autre chose.

0
répondu Ben 2017-05-23 10:31:27