¿Cifrar archivos solo con SSH -priv-key?

22

Supongamos que quiero cifrar un archivo para que solo yo pueda leerlo, conociendo mi contraseña de clave privada SSH. Estoy compartiendo un repositorio donde quiero cifrar u ofuscar información confidencial. Con eso, quiero decir que el repositorio contendrá la información, pero la abriré solo en casos especiales.

  1. Supongamos que estoy usando SSH-agent, ¿hay alguna manera fácil de cifrar el archivo para que solo yo pueda abrirlo más tarde?

  2. No puedo ver por qué debería usar GPG para esto, pregunta aquí ; Básicamente conozco la contraseña y solo quiero descifrar el archivo con la misma contraseña que mi clave SSH. es posible?

Comunidad
fuente

Respuestas:

27

Creo que su requisito es válido, pero por otro lado también es difícil, porque está mezclando cifrado simétrico y asimétrico. Por favor corrígeme si estoy equivocado.

Razonamiento:

  1. La frase de contraseña para su clave privada es proteger su clave privada y nada más.
  2. Esto lleva a la siguiente situación: desea utilizar su clave privada para cifrar algo que solo usted puede descifrar. Su clave privada no está destinada a eso, su clave pública está ahí para hacer eso. Lo que cifre con su clave privada puede ser descifrado por su clave pública (firma), eso ciertamente no es lo que desea. (Lo que se cifre con su clave pública solo se puede descifrar con su clave privada).
  3. Por lo tanto, debe usar su clave pública para cifrar sus datos, pero para eso, no necesita su frase de contraseña de clave privada para eso. Solo si desea descifrarlo necesitaría su clave privada y la frase de contraseña.

Conclusión: Básicamente, desea reutilizar su frase de contraseña para el cifrado simétrico. El único programa que le gustaría dar a su frase de contraseña es ssh-agent y este programa no hace cifrado / descifrado solo con la frase de contraseña. La frase de contraseña solo está ahí para desbloquear su clave privada y luego olvidarse.

Recomendación: Use openssl enco gpg -e --symmetriccon archivos de clave protegidos con frase de contraseña para el cifrado. Si necesita compartir la información, puede utilizar la infraestructura de clave pública de ambos programas para crear una PKI / Web of Trust.

Con openssl, algo como esto:

$ openssl enc -aes-256-ctr -in my.pdf -out mydata.enc 

y descifrar algo como

$ openssl enc -aes-256-ctr -d -in mydata.enc -out mydecrypted.pdf

Actualización: es importante tener en cuenta que los comandos openssl anteriores NO evitan que se alteren los datos. Un simple cambio de bit en el archivo enc también dará como resultado datos descifrados corruptos. Los comandos anteriores no pueden detectar esto, debe verificar esto, por ejemplo, con una buena suma de verificación como SHA-256. Hay formas criptográficas de hacer esto de manera integrada, esto se llama HMAC (Código de autenticación de mensajes basado en hash).

vasquez
fuente
55
Tiene razón en que una clave SSH es una clave asimétrica, no adecuada para cifrar un archivo. Y como consecuencia, los comandos que proporcione al final no funcionarán. Está intentando encriptar un archivo con RSA, pero solo puede encriptar una carga útil muy pequeña con RSA (el tamaño del módulo menos el relleno). El método normal es generar una clave simétrica de un solo uso, cifrarla con RSA y cifrar los datos reales con la clave simétrica. Es posible importar la clave ssh en gpg, esa sería la forma más sensata de implementar el requisito de hhh, pero usar gpg con una clave gpg es lo correcto.
Gilles 'SO- deja de ser malvado'
1
¿Por qué sugiere gpg con la bandera simétrica? ¿Funciona también con "gpg -e something"pero para diferentes casos?
1
@hhh Supuse que no compartirías tus archivos, por lo que usar simplemente simétrico es más seguro que usar criptografía de clave pública. No es necesario un par de claves público / privado, etc. De pgp.net/pgpnet/pgp-faq/… : "todavía se cree que RSA es el eslabón más débil de la cadena PGP". Esto también se aplica a otros mecanismos de pubkey como x509.
vasquez
1
¿Cómo sería el openssl-one-liner? Algo equivalente a $ gpg -e --symmetric?
1
Use esto para cifrar:, openssl enc -aes-256-cbc -in my.pdf -out mydata.encdescifrar con: openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfambos comandos solicitan la contraseña. Ver man enc(en rh / Fedora / CentOS) para todas las opciones como keyfiles, codificación base64, etc.
Vasquez
21

Preferiría usar la opensslutilidad, ya que parece ser bastante ubicua.

Convierta la clave pública RSA y la clave privada al formato PEM:

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
$ openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > id_rsa.pub.pem

Cifrar un archivo con su clave pública:

$ openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -in file.txt -out file.enc

Descifrar el archivo con su clave privada:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc -out file.txt

Pero, como Gilles comentó anteriormente, esto solo es adecuado para encriptar archivos más pequeños que su clave pública, por lo que podría hacer algo como esto:

Genere una contraseña, cifre el archivo con ella simétricamente y cifre la contraseña con su público, la clave la guarda en el archivo:

$ openssl rand 64 | 
tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) |
openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem  -out file.enc.key

Descifre la frase de contraseña con su clave privada y úsela para descifrar el archivo:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key | 
openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt

Terminarás con dos archivos, tu archivo encriptado y tu frase de contraseña encriptada, pero si lo pones en un script, funcionaría bien.

Incluso podría agregar una tar cvf file file.enc file.enc.keypara ordenar.

De manera óptima, maximizaría el tamaño de su frase de contraseña y cambiaría rand 64el tamaño de su clave pública.

kwarrick
fuente
Muy bien hecho, teniendo en cuenta los requisitos extravagantes del OP.
rsaw
2
Acabo de encontrar esto, buena publicación. Descubrí que la clave simétrica de tamaño máximo que puede generar a partir de la clave ssh es 12 bytes más corta que la clave ssh en sí misma, de lo contrario, el rsautl fallará con "datos demasiado grandes para el tamaño de la clave". Entonces esto funcionó en un script: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')autogen una longitud de clave. Dado que ssh-keygen tiene una longitud de keyle mínima de 768 bits, esto todavía conduce a una clave simétrica mínima de 672 bits, o 84 bytes.
markf
6

Mira luks / dm-crypt . Puede usar su clave privada ssh como clave de cifrado utilizando la opción adecuada.

Actualización: Ejemplo de encriptación usando LUKS con un dispositivo LV-block (prueba LV en sistema VG):

KEY=/home/youraccount/.ssh/id_dsa
DEVICE=/dev/system/test
cryptsetup luksFormat $DEVICE $KEY
cryptsetup luksOpen $DEVICE test_crypt --key-file $KEY

Esto debería generar un dispositivo de bloque / dev / mapper / test_crypt que puede usar para almacenar sus datos (después de formatearlo con un sistema de archivos de su elección).

Para deshacerse de él, desmóntelo y úselo cryptsetup luksClose test_crypt.

Nils
fuente
¿Podría dar MVO para hacerlo para que sea fácil de reutilizar? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Si puedo entender bien, este método es un cifrado a nivel de sistema de archivos. Cifra los fs que necesita para montar / montar o ¿estoy leyendo esto mal?
2
No creo que esto haga lo que tú crees que hace. La --key-fileopción de cryptsetup usa el contenido real del archivo como una contraseña grande. No lee la clave openssl del archivo y solo la usa. Puede usar un archivo de bytes aleatorios para el --key-filesi lo desea.
Patrick
@hhh Sí, este es un cifrado de nivel FS.
Nils
44
@Nils, pero lo que sucede cuando cambia la contraseña de su clave privada, ahora no podrá descifrar sus archivos a medida que cambian los datos en el archivo de clave. --key-filees realmente un nombre mal elegido para la opción, debería serlo--password-file
Patrick
1
@Patrick Esto es cierto: cambiar la frase de contraseña cambiará el archivo y, por lo tanto, la clave (desde la perspectiva de los luks). Pero incluso desde la perspectiva de ssh, no lo nombraría un archivo de contraseña. Sé que mi respuesta no da en el blanco, pero creo que proporcionará algunas ideas.
Nils