IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

crypt et decrypt données dans un fichier ini


Sujet :

Python

  1. #21
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    Est-ce que quelqu'un connait du java ici, comme cela je pourrais mettre mon code de cryptage et decryptage java (sauf si la modération n'est pas d'accord) ?

    Il y a un truc qui bloque, mais je sais pas quoi.

  2. #22
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    Après quelques recherche, j'ai trouvé :

    Voici le code (sans la passphrase ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    encoded_passphrase = passphrase.encode("utf8")
     
    cipher = AES.new(encoded_passphrase, AES.MODE_ECB)
     
    # with open(filename, "w", encoding="utf8") as config_file:
     
    # Read Data
    config = configparser.ConfigParser()
    config.read(filename, 'ascii')
     
    # Reading Data
    keys = ["server", "port", "user", "password"]
    for key in keys:
    	value = config.get("database", key)
    	if key == "server":
    		currentHost = value
    	if key == "port":
    		currentPort = value
    	if key == "user":
    		enc = base64.b64decode(value)
    		currentUserBytes = unpad(cipher.decrypt(enc),16)
    	if key == "password":
    		enc = base64.b64decode(value)
    		currentPasswordBytes = unpad(cipher.decrypt(enc),16)
     
    currentUser = currentUserBytes.decode()
    currentPassword = currentPasswordBytes.decode();
     
    #ASK User for modify data (ENTER keep current value)
    sBuffer = input("Hostname ("+currentHost+"): ")
    if sBuffer == "":
    	databaseHost = currentHost
    else:
    	databaseHost = sBuffer
     
    sBuffer = input("Port ("+currentPort+"): ")
    if sBuffer == "":
    	databasePort = currentPort
    else:
    	databasePort = sBuffer
     
    sBuffer = input("Utilisateur ("+currentUser+"): ")
    if sBuffer == "":
    	databaseUser = currentUser
    else:
    	databaseUser = sBuffer
     
    sBuffer = input("Mot de passe : ")
    if sBuffer == "" :
    	databasePassword = currentPassword
    else:
    	databasePassword = sBuffer
     
    config.set("database", "server", databaseHost)
    config.set("database", "port", databasePort)
     
    encryptedUser = base64.standard_b64encode(cipher.encrypt(pad(databaseUser.encode(),16)))
     
    encryptedPassword = base64.standard_b64encode(cipher.encrypt(pad(databasePassword.encode(),16)))
     
    # print(encryptedUser)
     
    config.set("database", "user",encryptedUser.decode())
    config.set("database", "password", encryptedPassword.decode())
     
    with open(filename, "w") as config_file:
        config.write(config_file)

  3. #23
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    Question suivante : où stocker la passphrase.
    Actuellement, elle est en dure dans le fichier .py, mais cela me convient.

    Je lis comme suggestion:
    • d'utiliser un autre fichier .py et de faire un import, mais est-ce vraiment une bonne idée ?
    • de faire un fichier ini et d'utiliser configparser
    • d'utiliser un fichier json

  4. #24
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 933
    Points : 7 343
    Points
    7 343
    Par défaut
    Je dirai le fichier ini... j'en ajouterai un autre qui serait le fichier comportant vos variables d'environnement (on le nomme souvent dans les projets ·env).

  5. #25
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Je dirai le fichier ini... j'en ajouterai un autre qui serait le fichier comportant vos variables d'environnement (on le nomme souvent dans les projets ·env).
    Le fichier .env... j'avais lus cela quelque pars et j'arrivais plus à trouver ...

    Je regarde cela

  6. #26
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 217
    Points : 4 699
    Points
    4 699
    Par défaut
    bonjour
    Citation Envoyé par cormnsa Voir le message
    Question suivante : où stocker la passphrase.
    Comment peux-tu poser une telle question si tu es admin réseau ? La sécurité c'est ton truc.

    Sans contexte, on ne peut que répondre à côté. Une app sur un poste bureau n'a rien à voir avec un script qui tourne sur serveur (en tant que service).

    Note: puisque tu es avec cette lib, il est possible (suivant le contexte) de chiffrer (encore ) cette pass phrase ....

    Exemple sur poste utilisateur :
    - on utilise une clé ssh de l'utilisateur (avec sa pass phrase ou sans) pour récupérer la pasphrase "serveur" (stockée chiffrée dans ini). Clé ssh peut même être spécifique que pour cette app (pour config serveur ?).
    - Il est logique d'utiliser une variable d'environnement ? cela ne dérange pas de donner à tous les utilisateurs le pass phrase du serveur ?
    - ...

    Je suppose que ton app n'est pas sur serveur, sinon ce n'est pas forcément logique de lire une sortie d'un script java. Puisque sur même serveur, autant lire à la même source que le script java.

    C'est à l'admin d'exiger une architecture , nous pauvres codeurs, on ne fait qu'exécuter et surtout on ne discute jamais ce point (pas notre rôle). Il demande la lune, on la lui sert sur un plateau.

    --------

    EDIT

    .ini, .env, généralement pour une app python c'est exactement la même chose. notre app va lire un fichier texte, le format interne n'a strictement aucune importance ! Par contre éventuellement où il est stocké peut avoir de l'importance au niveau sécurité et déploiement

  7. #27
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    1) Je rappelle que je débute en python et que donc je ne connais pas toutes les bonnes pratique de dev. en python (ex : l'entrée main).
    Et si je pose la question, c'est que justement, je me préoccupe de la sécurité et que laisser la passphrase en dur dans le code python m'embête

    2) En fait, le script python va être sur un serveur et va être l'outil d'édition du fichier de configuration utilisé par le programme java et qui tourne en service.
    Je pourrais très bien mettre en place l'édition en ligne de commande directement en Java, mais vus la criticité du programme, je n'ai pas de quoi me permettre d’interrompre son fonctionnement pour tester une edition d'une config qui pourrait ne jamais être modifié

    Donc, en utilisant en fichier ini ou .env, je sorts la passphrase du code (je pense même mettre ce fichier à un autre endroit que le programme python qui sera lui mis avec le programme java)

  8. #28
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 933
    Points : 7 343
    Points
    7 343
    Par défaut
    Bonjour,

    Citation Envoyé par cormnsa
    programme java et qui tourne en service
    Peux-tu être plus précis ? C'est un serveur http ?

  9. #29
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    Le programme en java lit des données d'une table et les transfère dans une autre table et cela à une haute fréquence (cycle de lecture/écriture inférieur à la minute).
    Les données source sont des données issues du serveur d'impression qui imprime des étiquettes collées sur des palettes et la table de destination sert à envoyer les palettes vers un ERP.

  10. #30
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 933
    Points : 7 343
    Points
    7 343
    Par défaut
    Je comprend pas... Comment communique ton script python vers ton code Java ?

  11. #31
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Je comprend pas... Comment communique ton script python vers ton code Java ?
    Il ne communique pas, le programme python sert juste à éditer/modifier le fichier de configuration utilisé par le programme java et rien d'autres.

  12. #32
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 933
    Points : 7 343
    Points
    7 343
    Par défaut
    Si le service lit le fichier de configuration en même temps que le script Python le modifie, cela peut poser des problèmes de concurrence, non ?

  13. #33
    Membre à l'essai
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 65
    Points : 22
    Points
    22
    Par défaut
    Le programme java charge le contenu du fichier au démarrage et il tourne avec les données chargées.

    La procédure pour éditer le fichier et la logique qui dois aller avec est : d'arrêter le service avant de faire l'édition du fichier de configuration
    Sinon, pour le fun... Comment on fait pour détecter qu'un programme xxx tourne en python ?

    Non, en fait, ce que je pourrais faire, c'est appeler le programme python de puis un script bash et dans le script bash tester si le programme java tourne et si oui => ne pas lancer le programme python !

  14. #34
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 217
    Points : 4 699
    Points
    4 699
    Par défaut
    Citation Envoyé par cormnsa Voir le message
    rappelle que je débute en python
    Justement, je n'ai jamais parlé de python
    note: hier signature "admin" et aujourd'hui "dev", du coup je ne sais à qui je m'adresse.

    Citation Envoyé par cormnsa Voir le message
    laisser la passphrase en dur dans le code python m'embête
    Encore heureux (pas que pour python )


    Citation Envoyé par cormnsa Voir le message
    être sur un serveur
    vus la criticité du programme
    je sorts la passphrase du code (je pense même mettre ce fichier à un autre endroit que le programme python qui sera lui mis avec le programme java)
    En fait, tu déplaces uniquement ta pasphrase en clair d'un fichier .py à un fichier de config (.env, .ini, ...) lui aussi en clair
    Donc en fait pour une chose critique tu ne fais rien de particulier, j'appelle cela même botter en touche.

    Comme écrit plus haut, ta problèmatique de sécurité est uniquement admin et pas python.
    Sans connaitre la politique de sécurité de ton serveur ... aucune bonne réponse de possible. Seul l'admin de ton serveur doit te donner un cahier des charges. Nous sommes dans un forum python, donc ce n'est pas la bonne place. Et puisque le serveur existe déjà, une politique bien établie doit déjà exister.

    Puisque ton script est serveur et que je suppose que tu te connecte via ssh sur le serveur, je t'ai donné plus haut une solution :
    utiliser la clé ssh de ta connexion :
    Tu mets ta passphrase de connexion encodée avec ta clé de connexion dans un fichier, puis lire le fichier et déchiffrer le contenu du fichier pour avoir la passphrase pour mots de passe dela BD.
    Puisque tu as déjà utilisé cette lib c'est extrêmement simple, par exemple ajouter ce speudo code au début de ton script:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '''
    mapassp.chiffrée > b"\x10\xaa\x8a\xf6g\xfc\x804\x02f\xdeg{Ug\xefVa\xb8\x08\x0e\xe8F\x0elH\xdfj\e3\xc3l\x1bo\x1d\xe3\xee\x1d\xdc|\xea}\x97\x02\xbev\x0b\t\xf4p%\xa0\xa6"
    '''
    from_file = open("/etc/not-read-d-wx--x--x/mapassp.chiffrée").read()  # on met un nom bateau ! certainement pas de cette forme, repertoire non listable
    pass_phrase = input("la pass phrase de votre connexion ?")  # et pas celle du chiffrage des mots de passe
     
    with open(f"~/.ssh/id_rsa", "rb") as k:
        key_priv = RSA.importKey(k.read(), passphrase=pass_phrase)
    decipher = Cipher_PKCS1_v1_5.new(key_priv)
    passphrase_en_clair = decipher.decrypt(from_file, None).decode()
    ps: si le pirate a acces via ssh de cet utilisateur ou root ? il a donc accès à la clé ssh aux scripts python,java, etc et donc, pour lui c'est comme si la clé est en clair ... Donc, ma solution présentée ici peut-être très insuffisante pour ton admin.
    Et un admin pourrait, pourquoi pas, exiger de ne pas utiliser un interpréteur… parce que le pirate (avec accès user uniquement) pourra toujours faire un cat /bin/lescript et donc décortiquer le code et entre autre voir où sont les fichiers de config critiques ou pire ... recopier ce script dans le home du user puis y insérer des print(mot_de_passe)

    Hors code (python), les admins ont généralement des réponses à leur problématique de sécurité.
    Par exemple, pourquoi ne pas faire saisir la passphrase (pour mots de passe) dans le script ?
    Par exemple, exécuter uniquement en local ton script et juste transférer le fichier .ini sur serveur. Ce n'est pas beaucoup plus sécurisé ???

  15. #35
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 901
    Points : 1 584
    Points
    1 584
    Billets dans le blog
    6
    Par défaut
    Bonjour.
    Citation Envoyé par cormnsa Voir le message
    Sinon, pour le fun... Comment on fait pour détecter qu'un programme xxx tourne en python ?

    Non, en fait, ce que je pourrais faire, c'est appeler le programme python de puis un script bash et dans le script bash tester si le programme java tourne et si oui => ne pas lancer le programme python !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if pgrep -f 'python3 prog.py' > /dev/null
    then
        echo "prog.py est actif."
    else
        echo "prog.py n'est pas actif."
    fi

  16. #36
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 217
    Points : 4 699
    Points
    4 699
    Par défaut
    Puisque tu parles de "service", je regarderais plutôt du coté de systemd (systemctl is-active "nom_du_service"), même chose pour le stopper et redémarrer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    systemctl is-active truc && systemctl stop truc # on peut aussi lancer le stop sans test avant ;)
    ...
    systemctl is-active truc || systemctl start truc # test sans doute inutile
    ps: je ne suis pas sûr qu'un service va lire 36 fois son fichier de config, normalement c'est uniquement au démarrage. Donc un simple systemctl restart "service" est suffisant après modif du .ini

    Et en "pur" python, nous avons les lib psutil et, si utile, systemd

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. récupéré un code crypté dans un fichier .ini
    Par FracMaster dans le forum Langage
    Réponses: 2
    Dernier message: 27/04/2007, 12h49
  2. Réponses: 8
    Dernier message: 18/07/2005, 14h04
  3. Unicité de nom de clés dans un fichier .INI
    Par The_Warlord dans le forum Langage
    Réponses: 8
    Dernier message: 11/11/2004, 12h16
  4. lire le point-virgule dans un fichier .ini
    Par juflata dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 05/07/2004, 12h46
  5. [VB6] Api pour supprimer dans un fichier INI
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/02/2003, 08h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo