Zaszyfruj hasło tymczasowe przy użyciu publicznego klucza ssh

9

Zarządzam wirtualnym biurem, a nasi pracownicy używają zarówno kluczy SSH, jak i haseł do uwierzytelniania. Jeśli jeden z naszych pracowników zapomni hasło, czy istnieje sposób na zaszyfrowanie hasła tymczasowego przy użyciu jego publicznego klucza RSA ssh, dzięki czemu mogę przesłać mu je e-mailem?

Widziałem inne pytania z tym związane, jednak „odpowiedzi” ogólnie odradzają używanie publicznego / prywatnego klucza SSH do ogólnego szyfrowania / deszyfrowania i nie określają, czy jest to możliwe. Chciałbym wiedzieć, czy jest to rzeczywiście możliwe i jakie są kroki do zaszyfrowania, a następnie odszyfrowania hasła.

David M. Syzdek
źródło

Odpowiedzi:

8

W końcu odkryłem, jak przekonwertować klucz publiczny OpenSSH do formatu PEM na blogu i udało mi się z powodzeniem zaszyfrować i odszyfrować ciąg przy użyciu mojego klucza prywatnego / publicznego.

Przedstawiłem kroki, które wykorzystałem do przeprowadzenia szyfrowania i deszyfrowania.

Aby zaszyfrować ciąg:

# 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

Aby odszyfrować ciąg (z pliku):

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

Ponieważ moim celem jest wysłanie hasła pocztą e-mail, napisałem niezwykle prosty skrypt, aby nieco zautomatyzować:

#!/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

Następnie mogę wysłać wynik skryptu w wiadomości e-mail, aby użytkownik mógł go odszyfrować.

Pełny skrypt jest dostępny na Github: https://gist.github.com/3078682

David M. Syzdek
źródło
4

Jest to możliwe, ponieważ jest to tylko klucz RSA. Użyj openssl:

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

Poderżnąłem to pytanie na Unix / Linux SE.

Muszę powiedzieć, że PGP jest do tego bardziej odpowiedni.

Lucas Kauffman
źródło
1
Problem polega na tym, że klucz publiczny SSH nie ma formatu, który rozpoznaje OpenSSL. Musiałem wiedzieć, jak przekonwertować klucz na coś, z czego mógłby następnie skorzystać zestaw narzędzi, taki jak OpenSSL.
David M. Syzdek
1

Zasadniczo tak, jest to możliwe. SHH generuje moduł N i dwa klucze e (klucz publiczny) id (klucz prywatny). Stosowanym mechanizmem jest zwykle RSA lub DSA, a wygenerowane klucze można wykorzystać do szyfrowania. Wszystko, co musisz zrobić, to wyodrębnić je z obiektu blob base64, który jest kluczem publicznym, a następnie użyć odpowiedniego programu do szyfrowania danych za pomocą tych kluczy. Możesz być zainteresowany Monkeysphere, który może przenosić między formatem klucza ssh a kluczem gnupg. Powinno to również umożliwić użycie kluczy do szyfrowania.

ktoś
źródło
0

Zwykle nie wykonuje się „szyfrowania zbiorczego” za pomocą kluczy asymetrycznych. Ale to nie ma znaczenia, ponieważ nie powinieneś zajmować się tym poziomem szczegółów. Użyj zestawu narzędzi (openssl jest świetny http://www.openssl.org/docs/apps/openssl.html ), aby wykonać pracę za Ciebie. To, co chcesz zrobić, to utworzyć zaszyfrowaną wiadomość zawierającą nowe hasło tymczasowe i określić parę kluczy użytkownika jako odbiorcę. Przykłady mnóstwo na tej stronie: http://www.openssl.org/docs/apps/smime.html

Baran
źródło