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.
Version imprimable
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.
Après quelques recherche, j'ai trouvé :
Voici le code (sans la passphrase :D) :
Code:
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)
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
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).
bonjour
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 :mouarf:) 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
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 :roll:
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)
Bonjour,
Peux-tu être plus précis ? C'est un serveur http ?Citation:
Envoyé par cormnsa
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.
Je comprend pas... Comment communique ton script python vers ton code Java ?
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 ?
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 ? :mouarf:
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 !
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.
Encore heureux (pas que pour python ;) )
En fait, tu déplaces uniquement ta pasphrase en clair d'un fichier .py à un fichier de config (.env, .ini, ...) lui aussi en clair :roll:
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:
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.Code:
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()
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) :aie:
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é ???
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.
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 .iniCode:
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
Et en "pur" python, nous avons les lib psutil et, si utile, systemd