¿Cuál es la mejor manera de almacenar una contraseña en un archivo de texto sin formato para que no sea legible por humanos?

Aquí hay una función que maximiza la seguridad (ver (2)) sin dejar de ser súper simple:

def encrypt_decrypt(password): enc_str = 'h213j2kh3kj213h41k' return "".join([chr(ord(a) ^ ord(b)) for a,b in zip(password,enc_str)]) 

El único requisito es que enc_str sea ​​más largo que la contraseña que va a utilizar. Probémoslo:

 >>> encrypt_decrypt('12abc') 'Y\x00PQ\t' 

Regresar usa la misma función:

 >>> encrypt_decrypt('Y\x00PQ\t') '12abc' 

Algunos comentarios

(1) Por supuesto, si alguien obtiene acceso a su código fuente, puede averiguar inmediatamente su contraseña, pero esto se aplica a todas las sugerencias.

(2) ¿Qué quiero decir con maximizar la seguridad? Con esto quiero decir que la única forma de recuperar su contraseña es forzarla por fuerza bruta o encontrar el código fuente. Se ha perdido toda la información que llevaba su contraseña (la entropía está maximizada). Esto se conoce como cifrado perfecto. Esto solo es posible si su clave de cifrado es al menos tan larga como la que está cifrando. ¡Sin embargo, todo esto depende de que enc_str sea ​​aleatorio! No solo pongas 'aaaaaaaaaaaa' . Vea el comentario de Anders Kaseorgs para una descripción más precisa.

(3) ¿Cómo funciona? Es un simple bit a bit exclusivo o. Convierte su contraseña y la cadena de cifrado en bits (10001101010 …) y hace XOR bit a bit en ellos.

Creo que la mejor manera es usar un sistema de administración de contraseñas provisto por el sistema operativo (Keychain en Mac, llavero Gnome / KDE en Linux, CryptoKeyring en Win). Fue diseñado para este caso de uso específico y incluido con distributivo.
Para Python puede usar llavero [1]. No estoy seguro de si hay alguna forma conveniente de usar con Bash.

[1] http://pypi.python.org/pypi/keyring

Diseño mis contraseñas para que una serie de preguntas / sugerencias para mí pueda darme la respuesta, pero nadie más. De esa manera puedo mantenerlos en un archivo ASCII, o en una nota adhesiva, o lo que sea.

Aquí hay un ejemplo de cómo puedes hacer esto.

Digamos que quieres recordar la contraseña: steak75greenSteelers

En un archivo de contraseña de texto sin formato, tendría línea tras línea que se lee así:

sugerencias / preguntas sobre el nombre de cuenta de dominio.com
———————————————————————-
whatever.com yourname y papas pickup fútbol irlandés

(puede omitir la columna de nombre de cuenta si usa el mismo nombre de cuenta en todas partes … en ese caso, solo menciónelo cuando no sea el mismo que el predeterminado)

La mayoría de la gente miraría el “fútbol irlandés” y pensaría “Notre Dame”. Pueden pasar todo el año en eso y nunca hacerlo bien. Sabes que nunca te gustó Notre Dame, por lo que no lo usarías en una contraseña. Te gusta el color verde y te gustan los Steelers, así que “fútbol irlandés” significa “Steelers verdes” para ti.

Necesitarían saber que su primera camioneta fue un vado ’75. Como no lo hacen, estás bastante seguro. Además, puede usar el tamaño y los detalles de la pista para obtener diferentes cadenas sobre lo mismo:
recogida 75
camioneta 1975
primera camioneta 75Ford
mi primera camioneta 1975 Ford

Y, por último, también estarían adivinando lo de la carne … podrían ser huevos y papas o cualquier otra cosa con papas.

Todas estas cosas juntas deben tener algún tipo de factor de unión: una imagen o un recuerdo en tu cabeza que no va a desaparecer.

Para el ejemplo anterior, eso sería esto: solo USTED sabe que una vez tomó una cita en un pub irlandés en su camioneta, comió bistec y papas y animó a los Steelers.

Lo que describí anteriormente es lo que Harry Loraine llamó una “asociación”, una imagen mental que asocia varias cosas que desea recordar.

El libro ahora está agotado, pero si puede desenterrar una copia de “The Memory Book”, puede aprender técnicas que le facilitarán el “pwn” de gestión de contraseñas dentro de su propio cerebro.

NOTA: la mayor parte de esta respuesta se escribió antes de que los detalles de la pregunta indicaran la necesidad de una solución programática

¿Ha considerado usar la API de Gmail ( https://developers.google.com/gm

No tendrá que almacenar contraseñas de texto sin formato, esta es la forma recomendada de acceder a sus datos de Google y está preparada para Python (2.7 y hay puertos para 3)

Si desea que otras personas puedan ver el script pero no leer su contraseña, ¿por qué no almacenar la contraseña en una variable de entorno? Esto se puede hacer con os.environ ( http://docs.python.org/library/o …)

Por ejemplo, su código de Python podría almacenar una referencia a os.environ [‘APPLICATION_PASSWORD’]. Por supuesto, tendría que establecer la contraseña en tiempo de ejecución, con suerte con un script seguro.

Personalmente, sugiero utilizar la verificación en dos pasos y las contraseñas específicas de la aplicación. Dichas contraseñas podrían encriptarse o almacenarse de una de las formas anteriores, y si alguien obtiene acceso a ellas, no serán demasiado útiles y pueden revocarse fácilmente.

Como la contraseña ya está encriptada, voy a suponer que está trabajando con ‘datos binarios’, mientras que probablemente contenga caracteres que no son fáciles de trabajar en archivos de texto; algunos de ellos no serán imprimibles y requerirán un escape manual, etc. .

Sugiero que solo base64 lo codifique.

Como otros han señalado, esto no ofrece seguridad adicional, pero le permitiría codificar en base64 la contraseña cifrada en una cadena copiable / pegable para un uso fácil y conveniente dentro del archivo de programa / configuración.

No necesita seguridad adicional ya que la contraseña ya está encriptada de acuerdo con su pregunta original. Entonces, cualquiera que vea esta cadena puede decodificarla en base64 y quedarse con una contraseña cifrada.

Suponiendo que va a almacenar el script en un lugar que no sea legible por nadie más que usted (o root) y que esté ejecutando Linux o tenga la biblioteca de herramientas estándar disponible, usaría tr.

http://www.manpagez.com/man/1/tr/

——-EDITAR

Aparentemente, el coreutils no tiene tr, rasca eso. Veo que el OP está usando Linux de todos modos.

O Cygwin en Windows o Coreutils para Win32 aquí: http://gnuwin32.sourceforge.net/
——Fin

Por ejemplo, usando el cifrado ROT13 simple (sustitución de un alfa por los 13 caracteres alfa que se encuentran adelante)

$ tr a-zA-Z n-za-mN-ZA-M

hace contraseña = cnffjbeq

1. Implemente cualquier esquema de Python razonable en este documento utilizando un módulo.
2. Ejecútelo una vez, creando así un módulo foo.pyc.
3. Cifre el módulo de texto plano foo.py (descifre solo para futuras revisiones).
4. El archivo pyc galimatías es todo lo que se necesita de ahora en adelante (pero tenga en cuenta que se puede aplicar ingeniería inversa con cierto esfuerzo).

¿No tiene que ser tan seguro?
Si es así, XOR es más fácil. si su contraseña es ‘abc’ y X es algo que solo conoce, el cifrado es a ^ X, b ^ X, c ^ X, el descifrado es (a ^ X) ^ X, etc.

use base64. Guarde la “contraseña” .encode (“base64”) en un archivo de texto sin formato.
léalo y decodifíquelo: “base64string” .decode (“base64”).

Sugiero almacenar las contraseñas cifradas a través de “TrueCrypt”, con un cifrado de bits alto.

solo necesita cambiar el mod del archivo a 600, de esta manera solo usted y el usuario root pueden ver y editar ese archivo