linux - puddletag - GnuPG: ¿Cómo editar el archivo sin descifrarlo y guardarlo primero en el disco local?
musicbrainz picard portable (14)
¡Hoy mismo he descubierto una forma de hacer todo eso en vim!
Aquí está el enlace: instrucciones completas sobre la configuración de vim para archivos gpg
funciona como un encanto, solo en ese tutorial, el enlace al complemento es url a una página para que no lo hagamos, pero ve a la página y selecciona la que quieres descargar.
Estoy usando GNUPG para cifrar mis archivos ascii.
Aprendí a generar una clave, y también a usarla para cifrar y descifrar un archivo.
Hay dos formas que he usado:
gpg -d foo.txt.gpg
y
gpg --output foo.txt --decrypt
foo.txt.gpg
Me di cuenta de que el primer método mostrará el archivo descifrado en la pantalla, por ejemplo, cuando ejecuté el comando sobre SSH.
Con respecto al segundo método, me preocupa si dejará un rastro en la PC local, el archivo foo.txt.
Lo más importante es que no sé cómo editar el contenido del archivo foo sobre la marcha. Idealmente, me gustaría abrir el archivo a través de SSH. Use nano / pico, escriba mi contraseña para descifrar, luego edite el archivo, guárdelo y cifrelo. Me gusta mucho evitar guardar los archivos en el disco local.
Cualquier comentario es bienvenido.
Gracias de antemano.
¿Dónde está el complemento gnupg ? Exactamente para este punto, por ejemplo
Aquí hay una ligera mejora en la respuesta de @Lucas. Hace dos pequeñas mejoras:
Evita el seguimiento de la pila si el archivo no se modifica durante la sesión de edición.
Restaura el archivo gpg original si se intentó volver a cifrar el archivo gpg original, lo cual es un poco más seguro que verificar las fechas de modificación del archivo de edición.
#!/usr/bin/python
# Downloaded from https://.com/questions/1510105/gnupg-how-to-edit-the-file-without-decrypt-and-save-to-local-disk-first/12289967#12289967
# and then slightly improved.
import os, sys, subprocess, getpass, stat, shutil
editor = ''nano''
dataFile = sys.argv[1]
## make a backup of the encrypted file
bakFile = dataFile+''-gpgedit_backup''
shutil.copy(dataFile, bakFile)
dstat = os.stat(dataFile)
## create temporary directory in tmpfs to work from
tmpDir = ''/dev/shm/gpgedit''
n = 0
while True:
try:
os.mkdir(tmpDir+str(n))
break
except OSError as err:
if err.errno != 17: ## file already exists
raise
n += 1
tmpDir += str(n)
os.chmod(tmpDir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
reEncrypted = False
try:
## Get password
passwd = getpass.getpass()
## decrypt file
tmpFile = os.path.join(tmpDir, ''data'')
cmd = "gpg -d --cipher-algo AES256 --passphrase-fd 0 --output %s %s" % (tmpFile, dataFile)
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE)
proc.stdin.write(passwd)
proc.stdin.close()
if proc.wait() != 0:
raise Exception("Error decrypting file.")
## record stats of tmp file
stat = os.stat(tmpFile)
## invoke editor
os.system(''%s %s'' % (editor, tmpFile))
## see whether data has changed
stat2 = os.stat(tmpFile)
if stat.st_mtime == stat2.st_mtime and stat.st_size == stat2.st_size:
print "Data unchanged; not re-writing encrypted file."
else:
## re-encrypt, write back to original file
reEncrypted = True
cmd = "gpg --yes --symmetric --cipher-algo AES256 --passphrase-fd 0 --output %s %s" % (dataFile, tmpFile)
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE)
proc.stdin.write(passwd)
proc.stdin.close()
if proc.wait() != 0:
raise Exception("Error encrypting file.")
except:
## If there was an error AND re-encryption was attempted, restore the backup.
if reEncrypted:
print "Error occurred; restoring encrypted file from backup."
shutil.copy(bakFile, dataFile)
raise
finally:
shutil.rmtree(tmpDir)
os.remove(bakFile)
Hubiera publicado estas mejoras sugeridas como comentarios a la respuesta de @ Luke, lo cual me gusta mucho, pero no tenía suficientes puntos de reputación para hacerlo. :(
Detesto vi, así que tuve que hacer un poco de pegamento alrededor de nano. Esto es lo que se me ocurrió. El inconveniente es que tienes que volver a introducir la contraseña al cifrar.
alias file_ed="gpg file.txt.gpg; nano file.txt; gpg -c --force-mdc -o file.txt.gpg_temp file.txt; mv file.txt.gpg_temp file.txt.gpg; rm file.txt"
No es muy seguro desde el punto de vista del sistema de archivos, pero me temo que otros usuarios y yo, no root.
Escribí un script en Python para resolver esto (solo para Linux). Funciona descifrando el archivo en / dev / shm para garantizar que los datos no cifrados nunca se escriban en el disco (aunque es posible que cualquiera de los programas que usan los datos se intercambien en el disco; esto casi siempre es una preocupación).
Esto tiene algunos beneficios sobre algunas de las otras respuestas publicadas:
- Solo es necesario escribir la contraseña una vez.
- Funciona con cualquier editor
Aquí está el código:
#!/usr/bin/python
import os, sys, subprocess, getpass, stat, shutil
editor = ''nano''
dataFile = sys.argv[1]
## make a backup of the encrypted file
bakFile = dataFile+''-gpgedit_backup''
shutil.copy(dataFile, bakFile)
dstat = os.stat(dataFile)
## create temporary directory in tmpfs to work from
tmpDir = ''/dev/shm/gpgedit''
n = 0
while True:
try:
os.mkdir(tmpDir+str(n))
break
except OSError as err:
if err.errno != 17: ## file already exists
raise
n += 1
tmpDir += str(n)
os.chmod(tmpDir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
try:
## Get password
passwd = getpass.getpass()
## decrypt file
tmpFile = os.path.join(tmpDir, ''data'')
cmd = "gpg -d --passphrase-fd 0 --output %s %s" % (tmpFile, dataFile)
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE)
proc.stdin.write(passwd)
proc.stdin.close()
if proc.wait() != 0:
raise Exception("Error decrypting file.")
## record stats of tmp file
stat = os.stat(tmpFile)
## invoke editor
os.system(''%s %s'' % (editor, tmpFile))
## see whether data has changed
stat2 = os.stat(tmpFile)
if stat.st_mtime == stat2.st_mtime and stat.st_size == stat2.st_size:
raise Exception("Data unchanged; not writing encrypted file.")
## re-encrypt, write back to original file
cmd = "gpg --yes --symmetric --passphrase-fd 0 --output %s %s" % (dataFile, tmpFile)
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE)
proc.stdin.write(passwd)
proc.stdin.close()
if proc.wait() != 0:
raise Exception("Error encrypting file.")
except:
## If there was an error AND the data file was modified, restore the backup.
dstat2 = os.stat(dataFile)
if dstat.st_mtime != dstat2.st_mtime or dstat.st_size != dstat2.st_size:
print "Error occurred, restored encrypted file from backup."
shutil.copy(bakFile, dataFile)
raise
finally:
shutil.rmtree(tmpDir)
os.remove(bakFile)
Inspirado por la respuesta de Luke, yo mismo escribí un guión de Python. Con suerte, alguien encontrará esto útil. Aquí están las características principales:
- usa un archivo temporal bajo / dev / shm usando un método seguro para generar archivos temporales
- Crea un archivo de respaldo en caso de fallas.
- Ambos modos de cifrado (clave pública / simétrica)
- crear un nuevo archivo sobre la marcha
- Elige tu editor a través de variables de entorno.
Más información se puede encontrar en el propio script. Actualmente no funcionará en ninguna máquina que no sea * nix.
Para instalar el script, simplemente póngalo en cualquier directorio de su ruta y hágalo ejecutable.
Advertencia: Copia de seguridad de sus datos! El script viene sin ninguna garantía!
Para abrir archivos gpg, edítelos y luego ecrypt / guardar de nuevo use: el icono kgpg en la bandeja del sistema tiene la opción: Editor ... Presione, luego abra el archivo gpg, luego en la parte inferior hay un botón para descifrarlo y listo. tenga su archivo en el editor, después de realizar cualquier cambio, simplemente presione Encrypt y luego guárdelo.
Si su editor puede leer la entrada de una canalización y guardarla en una tubería, entonces realmente puede usar la versión de gpg que se desencripta en stdout y encripta desde stdin. Desafortunadamente, para nano, la lectura de una tubería solo está planeada para 2.4 . Por ejemplo, para gvim, puede vincular el descifrado y el cifrado (a través de tuberías) a una clave .
También he pasado innumerables horas en esta búsqueda: simplemente cifre un archivo de texto con una frase de contraseña con un simple acceso de lectura + escritura. No quería tratar con claves privadas / públicas ni con llaveros vinculados a un inicio de sesión del sistema operativo, bla, bla, bla. El cifrado de archivos solo con frase de contraseña es tan simple, tan universal y perfecto para que un simple archivo de texto contenga contraseñas. No exagerar ni complicar una solución basada en bases de datos como KeePass, etc. (que también requiere la entrada de datos en múltiples elementos de la GUI en lugar de simplemente escribir sus contraseñas en un archivo de texto con capacidad de búsqueda). El estándar de oro en Windows es Steganos LockNote. ¿Cómo hacerlo en Linux? Sorprendentemente muy difícil de encontrar, pero ...
Finalmente me reuní con la recomendación que considero mejor: la crema. http://cream.sourceforge.net/ Cream es una fachada a la vim para que sea más fácil de usar ... útil para otros miembros de la familia (soy un geek de Linux que se siente cómodo trabajando con vi [m], pero necesitaba algo mas accesible para mi familia).
Solo ingresa:
"vim -x yourfile.txt"
Se guardará como cifrado con una frase de contraseña.
Puedes usar vim o crema en este punto:
"vim yourfile.txt" o "cream yourfile.txt".
Cualquiera de los dos abrirá "yourfile.txt" de forma nativa y solicitará la frase de contraseña, y permitirá de forma transparente las ediciones y los resguardos cifrados. FINALMENTE la búsqueda se ha completado !!!!
Una alternativa es tener un sistema de archivos tmp en RAM usando tmpfs y luego, cuando se apaga, desaparecerá para siempre.
Una cosa a tener en cuenta es que mantener los datos no cifrados en la memoria no es garantía de que no pueda acceder al disco. Si el sistema en cuestión está bajo una gran carga, cualquier dato no cifrado puede escribirse en la partición de intercambio. De manera similar, si el sistema se pone en modo de suspensión, el estado de cualquier proceso suspendido se almacenará en el disco. Si su programa se ejecuta en un sistema integrado, es posible que su memoria y su "disco" sean lo mismo.
La llamada al sistema mlock()
protegerá la memoria asignada para que no se cambie al disco. Sin embargo, esto requiere privilegios administrativos y lo limita a un lenguaje de bajo nivel en el que es directamente responsable de la administración de la memoria.
Dicho esto, es prudente evitar la creación de archivos con datos no cifrados. Solo sepa que esto no le ofrece 100% de seguridad si el sistema subyacente está comprometido.
Una forma es usar vim
. Vea esta página y esta pregunta relacionada.
Si necesita más flexibilidad o no desea utilizar vim
, escribir un programa corto para leer el texto descifrado proveniente de STDOUT, editarlo a su gusto y luego volver a cifrarlo no es demasiado difícil. Por ejemplo, puedes usar este código de Python mínimo (¡104 líneas!) Para darte el editor básico, y luego agregar la función de lectura y escritura de la secuencia.
Usando el editor joe (también conocido como Joe''s Own Editor ) en un comando similar a
gpg --decrypt foo.txt.gpg | joe - | gpg --armor --recipient [email protected] --encrypt > bar.txt.gpg
Hará lo que estés buscando.
El -
in joe -
le dice a joe que tome su entrada de stdin y que escriba su salida en stdout cuando guarde el archivo ( presione ctrl + ky luego x para guardar). Joe inicialmente mostrará algunos resultados crufty de gpg; esto se puede eliminar presionando ctrl + r para actualizar la pantalla.
Utilizo > bar.txt.gpg
para especificar el archivo de salida en lugar de --output bar.txt.gpg
porque el indicador --output
hace que gpg abra un diálogo interactivo si está sobrescribiendo el archivo de salida, y esto confunde a joe.
viencrypt by Paul Tarjan es un script para editar archivos encriptados GPG sobre la marcha.