Cifre la contraseña temporal usando la clave ssh pública

9

Administro una oficina virtual y nuestro personal utiliza claves SSH y contraseñas para la autenticación. Si un miembro de nuestro personal olvida su contraseña, ¿hay alguna forma de encriptar una contraseña temporal usando su clave ssh pública RSA para que pueda enviársela por correo electrónico?

He visto otras preguntas relacionadas con esta, sin embargo, las "respuestas" generalmente recomiendan no usar las claves SSH públicas / privadas para realizar el cifrado / descifrado general y no indican si esto es posible. Me gustaría saber si es posible y cuáles son los pasos para cifrar y luego descifrar la contraseña.

David M. Syzdek
fuente

Respuestas:

8

Finalmente encontré cómo convertir una clave pública OpenSSH a formato PEM en un blog y pude cifrar y descifrar con éxito una cadena usando mi clave privada / pública.

He esbozado los pasos que usé para realizar el cifrado y descifrado.

Para cifrar una cadena:

# convert public key to PEM format
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8  > ~/.ssh/id_rsa.pub.pem

# encrypt string using public key
echo "String to Encrypt" \
   | openssl rsautl -pubin -inkey ~/.ssh/id_rsa.pub.pem -encrypt -pkcs \
   | openssl enc -base64 \
   > string.txt

Para descifrar una cadena (del archivo):

openssl enc -base64 -d -in string.txt \
    | openssl rsautl -inkey ~/.ssh/id_rsa -decrypt

Como mi objetivo es enviar la contraseña por correo electrónico, he escrito un script extremadamente básico para automatizar un poco las cosas:

#!/bin/sh
if test "x${1}" == "x";then
   echo "Usage: ${0} <username>"
   exit 1
fi
SSHUSER=${1}
printf "Enter Password: "
read PASS1
echo ""
echo ""
ssh-keygen -f /home/${SSHUSER}/.ssh/id_rsa.pub -e -m PKCS8 \
    > /tmp/ssh-pubkey-${SSHUSER}.pem
echo 'cat << EOF |openssl enc -base64 -d |openssl rsautl -inkey ~/.ssh/id_rsa -decrypt'
echo "New Password: ${PASS1}" \
   | openssl rsautl -pubin -inkey /tmp/ssh-pubkey-${SSHUSER}.pem -encrypt -pkcs \
   | openssl enc -base64
echo "EOF"
echo ""
rm -f /tmp/ssh-pubkey-${SSHUSER}.pem

Luego puedo enviar el resultado del script en un correo electrónico para que el usuario lo descifre.

El script completo está disponible en Github: https://gist.github.com/3078682

David M. Syzdek
fuente
4

Es posible ya que es solo una clave RSA. Use openssl:

openssl rsautl -encrypt -inkey alice.pub >message.encrypted

He descubierto esta pregunta en Unix / Linux SE.

Debo decir que PGP es más adecuado para esto.

Lucas Kauffman
fuente
1
El problema es que la clave pública SSH no está en un formato que OpenSSL reconozca. Necesitaba saber cómo convertir la clave en algo que luego podría ser utilizado por un kit de herramientas como OpenSSL.
David M. Syzdek
1

En general, sí, esto es posible. Todo lo que SHH hace es generar un Módulo N y dos claves e (la clave pública) yd (la clave privada). El mecanismo empleado suele ser RSA o DSA y las claves generadas se pueden utilizar para el cifrado. Todo lo que tendría que hacer es extraerlos del blob base64 que es la clave pública y luego usar un programa adecuado para cifrar los datos con estas claves. Puede interesarle Monkeysphere, que puede transferir entre el formato de clave ssh y las claves gnupg. Esto debería permitirle también utilizar las claves para el cifrado.

alguien
fuente
0

Normalmente uno no hace 'encriptación masiva' con claves asimétricas. Pero eso no importa, ya que no deberías lidiar con ese nivel de detalles. Utilice un kit de herramientas (openssl es un buen http://www.openssl.org/docs/apps/openssl.html ) para hacer el trabajo por usted. Lo que desea hacer es crear un mensaje cifrado que contenga la nueva contraseña temporal y especificar el par de claves del usuario como destinatario. Ejemplos en abundancia en esta página: http://www.openssl.org/docs/apps/smime.html

RAM
fuente