Tengo un script de 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)?
Respuestas:
La codificación Base64 está en la biblioteca estándar y servirá para detener a los surfistas de hombro:
fuente
base64
sea mejor ofuscar querot13
en este contexto. Por el contrario,base64
tiene sus características típicas (signo igual, ...) y, por lo tanto, es más fácil de detectar que otros enfoques. Sin embargo, cualquier ofuscación no tiene ningún beneficio práctico. Realmente malo que esta respuesta sea tan altamente calificada. Simplemente da una falsa sensación de seguridad ...base64
es preferible arot13
como está en la biblioteca estándar de Python.Douglas F Shearer's es la solución generalmente aprobada en Unix cuando necesita especificar una contraseña para un inicio de sesión remoto.
Agrega una opción --password-from-file para especificar la ruta y leer el texto sin formato 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 las contraseñas que el usuario de la secuencia de comandos no puede saber, puede ejecutar la secuencia de comandos con permiso extendido y tener el archivo de contraseña propiedad de ese usuario raíz / administrador.
fuente
Aquí hay un método simple:
Esto debería ser un poco más seguro que la decodificación base64, aunque es vulnerable a un descompilador py_to_pyc.
fuente
import peekabo
la contraseña está disponible comopeekaboo.password
(si peekaboo.py contienepassword='secret'
)cythonizing
su secuencia de comandos y al compartir el binario generado obtendrá el beneficio de esta respuesta + agregará otra capa de ofuscación, porque ahora tiene que descompilar el código C para acceder a la contraseña. Esto no es 100% seguro, pero tomará mucho trabajo llegar a los datos confidenciales que desea ocultar.Si está trabajando en un sistema Unix, aproveche el módulo netrc en la biblioteca estándar de Python. Lee las contraseñas de un archivo de texto separado (.netrc), que tiene el formato descrito aquí .
Aquí hay un pequeño ejemplo de uso:
fuente
La mejor solución, suponiendo que el usuario no pueda proporcionar el nombre de usuario y la contraseña en tiempo de ejecución, es probablemente un archivo fuente separado que contenga solo una inicialización variable para el nombre de usuario y la contraseña que se importan a su código principal. Este archivo solo necesitaría edición cuando cambian las credenciales. De lo contrario, si solo le preocupan los surfistas de hombro con recuerdos promedio, la codificación de base 64 es probablemente la solución más fácil. ROT13 es demasiado fácil de decodificar manualmente, no distingue entre mayúsculas y minúsculas y conserva demasiado significado en su estado cifrado. Codifique su contraseña e identificación de usuario fuera del script de Python. Haga que el script decodifique en tiempo de ejecución para su uso.
Dar credenciales de guiones para tareas automatizadas siempre es una propuesta arriesgada. Su secuencia de comandos debe tener sus propias credenciales y la cuenta que utiliza no debe tener otro acceso que no sea exactamente el necesario. Al menos la contraseña debe ser larga y bastante aleatoria.
fuente
¿Qué hay de importar el nombre de usuario y la contraseña de un archivo externo al script? De esa manera, incluso si alguien obtuviera el script, no obtendría automáticamente la contraseña.
fuente
base64 es el camino a seguir para sus necesidades simples. No hay necesidad de importar nada:
fuente
para la ofuscación de python3, el uso
base64
se realiza de manera diferente:lo que resulta en
y decodificando de nuevo a la cadena original
para usar este resultado donde se requieren objetos de cadena, el objeto de bytes se puede traducir
Para obtener más información sobre cómo python3 maneja los bytes (y las cadenas en consecuencia), consulte la documentación oficial .
fuente
Este es un problema bastante común. Por lo general, lo mejor que puedes hacer es
A) cree algún tipo de función de cifrado ceasar para codificar / decodificar (simplemente 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.
En ese sentido, si su aplicación se ejecuta como un servicio / demonio (como un servidor web), puede colocar su clave en un almacén de claves protegido por contraseña con la entrada de contraseña como parte del inicio del servicio. Se necesitará un administrador para reiniciar su aplicación, pero tendrá una buena pretensión para sus contraseñas de configuración.
fuente
Su sistema operativo probablemente proporciona facilidades para encriptar datos de forma segura. Por ejemplo, en Windows hay DPAPI (API de protección de datos). ¿Por qué no pedirle al usuario sus credenciales la primera vez que ejecuta y luego guardarlas encriptadas para las ejecuciones posteriores?
fuente
Más appraoch de cosecha propia en lugar de convertir autenticación / contraseñas / nombre de usuario en detalles cifrados. FTPLIB es solo el ejemplo. " pass.csv " es el nombre del archivo csv
Guardar contraseña en CSV como a continuación:
nombre_usuario
contraseña de usuario
(Sin encabezado de columna)
Leer el CSV y guardarlo en una lista.
Uso de elementos de lista como detalles de autenticación.
Código completo
fuente
Aquí está mi fragmento para tal cosa. Básicamente importa o copia la función a su código. getCredentials creará el archivo cifrado si no existe y devolverá una dicción, y updateCredential se actualizará.
fuente
Coloque la información de configuración en un archivo de configuración cifrado. Consulte esta información en su código con una clave. Coloque esta clave en un archivo separado por entorno y no la almacene con su código.
fuente
¿Conoces hoyo?
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))
prueba.py
Correr:
~ / .pit / default.yml:
fuente
/usr/lib/python3.7/site-packages/pit.py:93: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. return yaml.load(open(Pit._config))
Si se ejecuta en Windows, podría considerar usar la biblioteca win32crypt. Permite el almacenamiento y la recuperación de datos protegidos (claves, contraseñas) por parte del usuario que ejecuta el script, por lo tanto, las contraseñas nunca se almacenan en texto claro o en 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
fuente
Una forma de hacerlo es la siguiente:
En el caparazón de python:
Luego, cree un módulo con el siguiente código:
Una vez que haya hecho esto, puede importar mypassword directamente o puede importar el token y el cifrado para descifrarlos según sea necesario.
Obviamente, hay algunas deficiencias en este enfoque. Si alguien tiene tanto el token como la clave (como lo haría si tuviera el script), puede descifrarlo fácilmente. Sin embargo, se ofusca, y si compila el código (con algo como Nuitka) al menos su contraseña no aparecerá como texto sin formato en un editor hexadecimal.
fuente
Esto no responde con precisión a su pregunta, pero está relacionado. Iba a agregar como comentario pero no estaba permitido. He estado lidiando con este mismo problema, y hemos decidido exponer el script a los usuarios que usan Jenkins. Esto nos permite almacenar las credenciales de db en un archivo separado que está encriptado y protegido en un servidor y que no es accesible para personas que no son administradores. También nos permite un poco de acceso directo para crear una interfaz de usuario y acelerar la ejecución.
fuente
También podría considerar la posibilidad de almacenar la contraseña fuera del script y proporcionarla en tiempo de ejecución
por ejemplo fred.py
que se puede ejecutar como
Se pueden lograr capas adicionales de "seguridad a través de la oscuridad" usando
base64
(como se sugirió anteriormente), usando nombres menos obvios en el código y distanciando aún más la contraseña real del código.Si el código está en un repositorio, a menudo es útil almacenar secretos fuera de él , por lo que podría agregar esto a
~/.bashrc
(o a una bóveda, o un script de lanzamiento, ...)y cambiar
fred.py
aluego vuelva a iniciar sesión y
fuente
¿Por qué no tener un simple xor?
Ventajas:
Llego al punto en el que reconozco cadenas b64 simples para palabras comunes y rot13 también. Xor lo haría mucho más difícil.
fuente
fuente
Hay varias utilidades ROT13 escritas en Python en la red, solo google para ellas. ROT13 codifica la cadena fuera de línea, la copia en la fuente, decodifica en el punto de transmisión.
Pero esta es una protección realmente débil ...
fuente