160 votes

Cacher un mot de passe dans un script python (obfuscation non sécurisée uniquement)

J'ai un script python qui crée une connexion ODBC. La connexion ODBC est générée avec une chaîne de connexion. Dans cette chaîne de connexion, je dois inclure le nom d'utilisateur et le mot de passe pour cette connexion.

Existe-t-il un moyen simple de masquer ce mot de passe dans le fichier (de sorte que personne ne puisse le lire lorsque j'édite le fichier) ?

17 votes

N'oubliez pas que les utilisateurs qui exécutent ce fichier auront au moins un accès en lecture et pourront facilement récupérer les mots de passe. Si les thins ne peuvent être lus que par vous et que vous êtes inquiet que les gens les voient par-dessus votre épaule, allez-y, mais soyez prévenus que si l'observateur moyen ne peut pas mémoriser les choses assez rapidement pour saisir un mot de passe, n'importe qui ayant accès au script et un petit peu de savoir-faire technique et d'ambition sera capable de saisir vos mots de passe. Réfléchissez toujours très attentivement à la sécurité, c'est important.

136voto

Dave Webb Points 90034

Encodage Base64 est dans la bibliothèque standard et fera l'affaire pour arrêter les surfeurs d'épaule :

>>> import base64
>>>  print(base64.b64encode("password".encode("utf-8")))
cGFzc3dvcmQ=
>>> print(base64.b64decode("cGFzc3dvcmQ=").decode("utf-8"))
password

7 votes

Je suis d'accord. Le mot de passe codé en base64 a l'air beaucoup plus mystérieux.

5 votes

Mais cela n'arrange pas le fait que le script doit être lisible par l'utilisateur qui l'exécute et que le mot de passe ne le doit pas.

1 votes

Vous ne codez pas l'intégralité du script cependant. Juste le mot de passe à l'intérieur du script.

55voto

Martin Beckett Points 60406

Douglas F Shearer's est la solution généralement approuvée dans Unix lorsque vous devez spécifier un mot de passe pour une connexion à distance.
Vous ajoutez un --password-from-file pour spécifier le chemin et lire le texte en clair depuis un fichier.
Le fichier peut alors se trouver dans la zone propre à l'utilisateur, protégée par le système d'exploitation. Il permet également à différents utilisateurs de récupérer automatiquement leur propre fichier.

Pour les mots de passe que l'utilisateur du script n'est pas autorisé à connaître - vous pouvez exécuter le script avec une permission élargie et faire en sorte que le fichier de mots de passe appartienne à cet utilisateur Root/admin.

1 votes

Comment exactement exécuter le script avec des permissions élevées sans donner un mot de passe Root ou admin ? Est-ce lié à la définition des bits UID ?

4 votes

C'est pas grave, j'ai trouvé la solution. Pour tous ceux que ça intéresse : Si un script a un bit setuid activé, le système d'exploitation va "passer le bit setuid à l'interpréteur. Malheureusement, il existe d'énormes failles de sécurité et la plupart des distributions modernes désactivent setuid pour les scripts.

0 votes

Je ne trouve aucune information sur l'option --password-from-file. Avez-vous des exemples ? Merci !

31voto

jonasberg Points 143

Si vous travaillez sur un système Unix, profitez du module netrc de la bibliothèque Python standard. Il lit les mots de passe à partir d'un fichier texte séparé (.netrc), dont le format est décrit ci-dessous. ici .

Voici un petit exemple d'utilisation :

import netrc

# Define which host in the .netrc file to use
HOST = 'mailcluster.loopia.se'

# Read from the .netrc file in your home directory
secrets = netrc.netrc()
username, account, password = secrets.authenticators( HOST )

print username, password

19voto

tduehr Points 271

La meilleure solution, en supposant que le nom d'utilisateur et le mot de passe ne peuvent pas être donnés à l'exécution par l'utilisateur, est probablement un fichier source séparé contenant uniquement l'initialisation des variables pour le nom d'utilisateur et le mot de passe qui est importé dans votre code principal. Ce fichier ne devrait être modifié que lorsque les informations d'identification changent. Sinon, si vous ne vous préoccupez que des internautes à la mémoire moyenne, le codage en base 64 est probablement la solution la plus simple. ROT13 est trop facile à décoder manuellement, n'est pas sensible à la casse et conserve trop de sens dans son état crypté. Encodez votre mot de passe et votre identifiant d'utilisateur en dehors du script de python. Faites décoder le script au moment de l'exécution pour l'utiliser.

Donner à des scripts des informations d'identification pour des tâches automatisées est toujours une proposition risquée. Votre script devrait avoir ses propres informations d'identification et le compte qu'il utilise ne devrait pas avoir d'accès autre que ce qui est exactement nécessaire. Au moins le mot de passe devrait être long et plutôt aléatoire.

0 votes

Très belle réponse - merci. Pour les petits scripts que j'écris (qui sont des scripts de maintenance de toute façon - l'encodage BASE64 suffira)

4 votes

Cela semble bien, mais pouvez-vous donner un exemple de mise en œuvre ? Pour l'instant, il s'agit juste d'une description d'une pratique générale, qui n'est pas très utile pour quelqu'un qui n'a jamais fait cela auparavant.

19voto

Douglas F Shearer Points 10422

Pourquoi ne pas importer le nom d'utilisateur et le mot de passe depuis un fichier externe au script ? De cette façon, même si quelqu'un mettait la main sur le script, il n'obtiendrait pas automatiquement le mot de passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X