Ocultar una contraseña en un script python (solo ofuscación insegura)


Tengo un script python que está creando una conexión ODBC. La conexión ODBC se genera con una cadena de conexión. En esta cadena de conexión tengo que incluir el nombre de usuario y la contraseña para esta conexión.

¿Hay una manera fácil de ocultar esta contraseña en el archivo (solo que nadie puede leer la contraseña cuando estoy editando el archivo) ?

Author: dreftymac, 2008-10-01

14 answers

Base64 encoding está en la biblioteca estándar y hará para detener a los surfistas de hombro:

>>> import base64
>>> print base64.b64encode("password")
cGFzc3dvcmQ=
>>> print base64.b64decode("cGFzc3dvcmQ=")
password
 93
Author: Dave Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 09:33:13

Douglas F Shearer es la solución generalmente aprobada en Unix cuando necesita especificar una contraseña para un inicio de sesión remoto.
Se agrega una opción password password-from-file para especificar la ruta y leer texto plano de un archivo.
El archivo puede estar en el área del usuario protegida por el sistema operativo. También permite a diferentes usuarios recoger automáticamente su propio archivo.

Para contraseñas que el usuario del script no puede conocer - puede ejecutar el script con permiso elavated y tener el archivo de contraseña propiedad de ese usuario root / admin.

 47
Author: Martin Beckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 15:34:13

Aquí hay un método simple:

  1. Crear un módulo python-vamos a llamarlo peekaboo.py.
  2. En peekaboo.py, incluya tanto la contraseña como cualquier código que necesite esa contraseña
  3. Crear una versión compilada - peekaboo.pyc-importando este módulo (vía python commandline, etc...).
  4. Ahora, eliminar peekaboo.py.
  5. Ahora puedes importar felizmente peekaboo confiando solo en peekaboo.pyc. Desde peekaboo.pyc es byte compilado no es legible para el casual usuario.

Esto debería ser un poco más seguro que la decodificación base64, aunque es vulnerable a un descompilador py_to_pyc.

 37
Author: manyPartsAreEdible,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-02 20:08:50

Si está trabajando en un sistema Unix, aproveche el módulo netrc en la biblioteca estándar de Python. Lee contraseñas de un archivo de texto separado (.netrc), que tiene el formato descrito aquí .

Aquí hay un pequeño ejemplo de uso:

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
Author: jonasberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-23 09:17:55

La mejor solución, asumiendo que el usuario no puede dar el nombre de usuario y la contraseña en tiempo de ejecución, es probablemente un archivo fuente separado que contiene solo la inicialización variable para el nombre de usuario y la contraseña que se importa en su código principal. Este archivo solo necesitará edición cuando cambien las credenciales. De lo contrario, si solo te preocupan los surfistas de hombro con recuerdos promedio, la codificación base 64 es probablemente la solución más fácil. ROT13 es demasiado fácil de decodificar manualmente, no es el caso sensible y conserva demasiado significado en su estado cifrado. Codifica tu contraseña y tu id de usuario fuera del script python. Haga que el script descodifique en tiempo de ejecución para su uso.

Dar credenciales de scripts para tareas automatizadas siempre es una propuesta arriesgada. Su script debe tener sus propias credenciales y la cuenta que utiliza no debe tener ningún acceso que no sea exactamente lo que es necesario. Al menos la contraseña debe ser larga y bastante aleatoria.

 18
Author: tduehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 16:16:33

¿Qué tal importar el nombre de usuario y la contraseña de un archivo externo al script? De esa manera, incluso si alguien se apodera del script, no obtendría automáticamente la contraseña.

 16
Author: Douglas F Shearer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 15:28:38

Base64 es el camino a seguir para sus necesidades simples. No hay necesidad de importar nada:

>>> 'your string'.encode('base64')
'eW91ciBzdHJpbmc=\n'
>>> _.decode('base64')
'your string'
 14
Author: tzot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 22:26:09

Este es un problema bastante común. Por lo general, lo mejor que puede hacer es

A) crear algún tipo de función de cifrado ceasar para codificar / decodificar (solo que no rot13) o B) el método preferido es utilizar una clave de cifrado, al alcance de su programa, codificar/decodificar la contraseña. En el que puede utilizar la protección de archivos para proteger el acceso a la clave. A lo largo de esas líneas, si su aplicación se ejecuta como un servicio/demonio (como un servidor web), puede poner su clave en un almacén de claves protegido por contraseña con el introducción de contraseña como parte del inicio del servicio. Se necesitará un administrador para reiniciar tu aplicación, pero tendrás una muy buena pretección para tus contraseñas de configuración.

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 16:19:00

Su sistema operativo probablemente proporciona facilidades para cifrar datos de forma segura. Por ejemplo, en Windows hay DPAPI (API de protección de datos). ¿Por qué no preguntar al usuario por sus credenciales la primera vez que se ejecuta a continuación, ardilla de distancia cifrada para las ejecuciones posteriores?

 2
Author: Jamie Eisenhart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 15:22:32

Más appraoch de cosecha propia en lugar de convertir autenticación / contraseñas / nombre de usuario a detalles encriptados. FTPLIB es solo el ejemplo. "pase.csv " es el nombre del archivo csv

Guardar la contraseña en CSV como a continuación:

User_name

User_password

(Sin encabezado de columna)

Leyendo el CSV y guardándolo en una lista.

Usando los elementos de lista como detalles de authetntication.

Código Completo.

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
Author: LonelySoul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-30 19:24:20

Coloque la información de configuración en un archivo de configuración cifrado. Consulta esta información en tu código usando una clave. Coloque esta clave en un archivo separado por entorno y no la almacene con su código.

 1
Author: FlySwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 22:29:38

Si se ejecuta en Windows, podría considerar el uso de la biblioteca win32crypt. Permite el almacenamiento y la recuperación de datos protegidos (claves, contraseñas) por el usuario que está ejecutando el script, por lo que las contraseñas nunca se almacenan en texto claro u formato ofuscado en su código. No estoy seguro de si hay una implementación equivalente para otras plataformas, por lo que con el uso estricto de win32crypt su código no es portátil.

Creo que el módulo se puede obtener aquí: http://timgolden.me.uk/pywin32-docs/win32crypt.html

 1
Author: VilleLipponen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-11 16:37:02

Hay varias utilidades ROT13 escritas en Python en la 'Red just solo google para ellos. ROT13 codifica la cadena sin conexión, cópiala en la fuente, decodifica en el punto de transmisión.

Pero esto es muy débil protección...

 0
Author: Kevin Little,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 14:43:20

¿Conoces a pit?

Https://pypi.python.org/pypi/pit (solo py2 (versión 0.3))

Https://github.com/yoshiori/pit (funcionará en py3 (versión actual 0.4))

Test.py

from pit import Pit

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

Ejecutar:

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

~/.pit / default.yml:

section-name:
  password: my-password
  username: my-name
 0
Author: TakesxiSximada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-28 10:03:26