Masquer un mot de passe dans un script python (obscurcissement non sécurisé 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 inclure le nom d'utilisateur et le mot de passe pour cette connexion.

Existe-t-il un moyen facile d'obscurcir ce mot de passe dans le fichier (juste que personne ne peut lire le mot de passe lorsque je modifie le fichier) ?

105
demandé sur dreftymac 2008-10-01 18:37:17

14 réponses

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

>>> import base64
>>> print base64.b64encode("password")
cGFzc3dvcmQ=
>>> print base64.b64decode("cGFzc3dvcmQ=")
password
93
répondu Dave Webb 2018-07-10 09:33:13

Douglas F Shearer's est la solution généralement approuvée sous Unix lorsque vous devez spécifier un mot de passe pour une connexion à distance.
Vous ajoutez une option --password-from-file pour spécifier le chemin et lire le texte brut à partir d'un fichier.
Le fichier peut alors être dans la propre zone de l'utilisateur protégée par le système d'exploitation. Il permet également aux différents utilisateurs de ramasser 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 elavated permission et ont le fichier de mot de passe appartenant à cet utilisateur root/admin.

47
répondu Martin Beckett 2008-10-01 15:34:13

Voici une méthode simple:

  1. Créer un module python-appelons - le peekaboo.py.
  2. dans peekaboo.py, inclure à la fois le mot de passe et tout code ayant besoin de ce mot de passe
  3. Créer une version compilée - coucou.pyc - en important ce module (via la ligne de commande python, etc...).
  4. Maintenant, supprimer peekaboo.py.
  5. vous pouvez maintenant importer joyeusement peekaboo en se fondant uniquement sur peekaboo.pyc. Depuis coucou.pyc est compilé par octet il n'est pas lisible pour le casual utilisateur.

Cela devrait être un peu plus sûr que le décodage base64-bien qu'il soit vulnérable à un décompilateur py_to_pyc.

37
répondu manyPartsAreEdible 2014-04-02 20:08:50

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 (.netrc), qui a le format décrit 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
23
répondu jonasberg 2011-06-23 09:17:55

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 de la variable pour le nom d'utilisateur et le mot de passe importés dans votre code principal. Ce fichier n'aurait besoin d'être modifié que lorsque les informations d'identification changent. Sinon, si vous ne vous inquiétez que des surfeurs d'épaule avec des souvenirs moyens, l'encodage de base 64 est probablement la solution la plus simple. ROT13 est juste trop facile à décoder manuellement, n'est-ce pas sensible et conserve trop de sens dans son état crypté. Encodez votre mot de passe et votre ID utilisateur en dehors du script python. Demandez-lui de décoder le script à l'exécution pour l'utiliser.

Donner des informations d'identification aux scripts pour les 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 avoir aucun accès autre que ce qui est exactement nécessaire. Au moins, le mot de passe devrait être long et plutôt aléatoire.

18
répondu tduehr 2008-10-01 16:16:33

Que diriez-vous d'importer le nom d'utilisateur et le mot de passe à partir d'un fichier externe au script? De cette façon, même si quelqu'un a mis la main sur le script, il n'obtiendrait pas automatiquement le mot de passe.

16
répondu Douglas F Shearer 2008-10-01 15:28:38

Base64 est le chemin à parcourir pour vos besoins simples. Il n'est pas nécessaire d'importer quoi que ce soit:

>>> 'your string'.encode('base64')
'eW91ciBzdHJpbmc=\n'
>>> _.decode('base64')
'your string'
14
répondu tzot 2008-10-01 22:26:09

C'est un problème assez commun. Généralement, le mieux que vous pouvez faire est de

A) créer une sorte de fonction de chiffrement ceasar pour encoder / décoder (juste pas rot13) ou B) la méthode préférée consiste à utiliser une clé de chiffrement, à la portée de votre programme, encoder/décoder le mot de passe. Dans lequel vous pouvez utiliser la protection des fichiers pour protéger l'accès à la clé. Dans ce sens, si votre application s'exécute en tant que service / démon (comme un serveur web), vous pouvez placer votre clé dans un magasin de clés protégé par mot de passe avec le saisie de mot de passe dans le cadre du démarrage du service. Il faudra un administrateur pour redémarrer votre application, mais vous aurez vraiment une bonne pretection pour vos mots de passe de configuration.

4
répondu 2008-10-01 16:19:00

Votre système d'exploitation fournit probablement des fonctionnalités pour crypter les données en toute sécurité. Par exemple, sous Windows, il y a DPAPI (Data protection API). Pourquoi ne pas demander à l'utilisateur leurs informations d'identification la première fois que vous exécutez puis les écureuil loin crypté pour les courses suivantes?

2
répondu Jamie Eisenhart 2008-10-01 15:22:32

Plus appraoch maison plutôt que de convertir l'authentification / mots de passe / nom d'utilisateur en détails incrytpted. FTPLIB est juste l'exemple. "passe.csv " est le nom du fichier csv

Enregistrer le mot de passe en CSV comme ci-dessous:

Nom_utilisateur

User_password

(Sans titre de colonne)

Lire le CSV et l'enregistrer dans une liste.

Utilisation des éléments de liste comme détails d'authentification.

Code complet.

import os
import ftplib
import csv 
cred_detail = []
os.chdir("Folder where the csv file is stored")
for row in csv.reader(open("pass.csv","rb")):       
        cred_detail.append(row)
ftp = ftplib.FTP('server_name',cred_detail[0][0],cred_detail[1][0])
2
répondu LonelySoul 2013-05-30 19:24:20

Placez les informations de configuration dans un fichier de configuration chiffré. Interrogez cette information dans votre code à l'aide d'une clé. Placez cette clé dans un fichier séparé par environnement et ne la stockez pas avec votre code.

1
répondu FlySwat 2008-10-01 22:29:38

Si vous utilisez Windows, vous pouvez envisager d'utiliser la bibliothèque win32crypt. Il permet le stockage et la récupération de données protégées (clés, Mots de passe) par l'utilisateur qui exécute le script, ainsi les mots de passe ne sont jamais stockés en texte clair ou au format obscurci dans votre code. Je ne suis pas sûr s'il existe une implémentation équivalente pour d'autres plates-formes, donc avec l'utilisation stricte de win32crypt, votre code n'est pas portable.

Je crois que le module peut être obtenu ici: http://timgolden.me.uk/pywin32-docs/win32crypt.html

1
répondu VilleLipponen 2017-11-11 16:37:02

Il y a plusieurs utilitaires ROT13 écrits en Python sur le Net-juste google pour eux. ROT13 encoder la chaîne hors ligne, Copier dans la source, décoder au point de transmission.

Mais c'est vraiment la faiblesse de la protection...

0
répondu Kevin Little 2008-10-01 14:43:20

Connaissez-vous pit?

Https://pypi.python.org/pypi/pit (py2 uniquement (version 0.3))

Https://github.com/yoshiori/pit (cela fonctionnera sur py3 (version actuelle 0.4))

Test.py

from pit import Pit

config = Pit.get('section-name', {'require': {
    'username': 'DEFAULT STRING',
    'password': 'DEFAULT STRING',
    }})
print(config)

Exécuter:

$ python test.py
{'password': 'my-password', 'username': 'my-name'}

~/.stands/par défaut.yml:

section-name:
  password: my-password
  username: my-name
0
répondu TakesxiSximada 2016-06-28 10:03:26