Szyfrowanie pliku tylko za pomocą klucza dostępu SSH?

22

Załóżmy, że chcę zaszyfrować plik, aby tylko ja mógł go odczytać, znając moje hasło klucza prywatnego SSH. Udostępniam repozytorium, w którym chcę zaszyfrować lub zaciemnić poufne informacje. Rozumiem przez to, że repozytorium będzie zawierało informacje, ale otworzę je tylko w szczególnych przypadkach.

  1. Załóżmy, że używam agenta SSH, czy istnieje jakiś prosty sposób na zaszyfrowanie pliku, aby tylko ja mógł go otworzyć później?

  2. Nie rozumiem, dlaczego mam do tego używać GPG, pytanie tutaj ; w zasadzie znam hasło i chcę odszyfrować plik tylko za pomocą tego samego hasła, co mój klucz SSH. czy to możliwe?

Społeczność
źródło

Odpowiedzi:

27

Myślę, że twoje wymagania są prawidłowe, ale z drugiej strony jest to również trudne, ponieważ miksujesz szyfrowanie symetryczne i asymetryczne. Proszę popraw mnie jeżeli się mylę.

Rozumowanie:

  1. Hasło do twojego klucza prywatnego służy do ochrony twojego klucza prywatnego i niczego więcej.
  2. Prowadzi to do następującej sytuacji: Chcesz użyć swojego klucza prywatnego do zaszyfrowania czegoś, co tylko Ty możesz odszyfrować. Twój klucz prywatny nie jest przeznaczony do tego, twój klucz publiczny jest do tego celu. Cokolwiek szyfrujesz za pomocą klucza prywatnego, może zostać odszyfrowane przez klucz publiczny (podpisywanie), to z pewnością nie to, czego chcesz. (Wszystko, co zostanie zaszyfrowane za pomocą klucza publicznego, można odszyfrować tylko za pomocą klucza prywatnego).
  3. Musisz więc użyć klucza publicznego do szyfrowania danych, ale do tego nie potrzebujesz hasła klucza prywatnego. Tylko jeśli chcesz go odszyfrować, potrzebujesz klucza prywatnego i hasła.

Wniosek: Zasadniczo chcesz ponownie użyć hasła do szyfrowania symetrycznego. Jedynym programem, który chciałbyś podać swojemu hasłu, jest ssh-agent i ten program nie wykonuje szyfrowania / deszyfrowania tylko za pomocą hasła. Hasło służy tylko do odblokowania klucza prywatnego, a następnie zostało zapomniane.

Zalecenie: do szyfrowania używaj plików kluczy chronionych hasłem openssl enclub gpg -e --symmetricz nimi. Jeśli potrzebujesz udostępnić informacje, możesz użyć infrastruktury klucza publicznego obu programów, aby utworzyć PKI / Web of Trust.

W openssl coś takiego:

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

i odszyfrowanie czegoś podobnego

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

Aktualizacja: Należy zauważyć, że powyższe polecenia openssl NIE zapobiegają manipulowaniu danymi. Proste odwrócenie pliku enc spowoduje również uszkodzenie uszkodzonych odszyfrowanych danych. Powyższe polecenia nie mogą tego wykryć, musisz to sprawdzić na przykład za pomocą dobrej sumy kontrolnej, takiej jak SHA-256. Istnieją kryptograficzne sposoby na zrobienie tego w zintegrowany sposób, nazywa się to HMAC (Hash-based Message Authentication Code).

wasquez
źródło
5
Masz rację, że klucz SSH jest kluczem asymetrycznym, nieodpowiednim do szyfrowania pliku. W rezultacie polecenia podane na końcu nie będą działać. Próbujesz zaszyfrować plik za pomocą RSA, ale możesz zaszyfrować tylko bardzo niewielki ładunek za pomocą RSA (rozmiar modułu minus dopełnienie). Normalną metodą jest wygenerowanie klucza symetrycznego jednorazowego użytku, szyfrowanie go za pomocą RSA i szyfrowanie rzeczywistych danych za pomocą klucza symetrycznego. Może być możliwe zaimportowanie klucza ssh do gpg, to byłby rozsądny sposób na spełnienie wymagań hhh - ale używanie gpg z kluczem gpg jest właściwe.
Gilles 'SO - przestań być zły'
1
Dlaczego sugerujesz gpg z flagą symetryczną? Działa również z "gpg -e something"różnymi przypadkami?
1
@ hhh Zakładałem, że nie będziesz udostępniać swoich plików, więc użycie zwykłej symetryczności jest bezpieczniejsze niż użycie kryptografii klucza publicznego. Nie ma potrzeby używania klucza publicznego / prywatnego itp. Od pgp.net/pgpnet/pgp-faq/… : „nadal uważa się, że RSA jest najsłabszym ogniwem w łańcuchu PGP”. Dotyczy to również innych mechanizmów klucza publicznego, takich jak x509.
vasquez
1
Jak wyglądałby jeden-liner openssl? Coś równoważnego $ gpg -e --symmetric?
1
Użyj tego do szyfrowania openssl enc -aes-256-cbc -in my.pdf -out mydata.enc:, odszyfruj za pomocą: openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfoba polecenia proszą o hasło. Zobacz man enc(na rh / fedora / centos) wszystkie opcje, takie jak pliki kluczy, kodowanie base64 itp.
vasquez
21

Wolałbym używać tego opensslnarzędzia, ponieważ wydaje się ono dość wszechobecne.

Konwertuj klucz publiczny i prywatny RSA na format 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

Szyfrowanie pliku za pomocą klucza publicznego:

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

Deszyfrowanie pliku za pomocą klucza prywatnego:

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

Ale, jak skomentował powyżej Gilles, jest to odpowiednie tylko do szyfrowania plików mniejszych niż twój klucz publiczny, więc możesz zrobić coś takiego:

Wygeneruj hasło, zaszyfruj je symetrycznie i zaszyfruj hasło publicznie, zapisując je w pliku:

$ 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

Odszyfruj hasło kluczem prywatnym i użyj go do odszyfrowania pliku:

$ 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

Skończysz na dwóch plikach, zaszyfrowanym pliku i zaszyfrowanym haśle, ale wstawienie do skryptu będzie działało dobrze.

Możesz nawet dodać tar cvf file file.enc file.enc.keyporządek.

Optymalnie można zmaksymalizować rozmiar hasła, a także zmienić rand 64rozmiar klucza publicznego.

kwarrick
źródło
Bardzo ładnie wykonane, biorąc pod uwagę dziwaczne wymagania PO.
rsaw
2
właśnie znalazłem ten fajny post. Odkryłem, że maksymalny rozmiar klucza symetrycznego, który możesz wygenerować z klucza ssh, jest o 12 bajtów krótszy niż sam klucz ssh, w przeciwnym razie rsautl zawiódłby z „danymi zbyt dużymi dla rozmiaru klucza”. Tak więc działało to w skrypcie: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')do autogenizacji długości klucza. Biorąc pod uwagę, że ssh-keygen ma minimalną długość klucza wynoszącą 768 bitów, nadal prowadzi to do uzyskania minimalnego klucza symetrycznego wynoszącego 672 bitów lub 84 bajtów.
markf 18.12.12
6

Spójrz na luks / dm-crypt . Możesz użyć klucza prywatnego ssh jako klucza szyfrowania, korzystając z odpowiedniej opcji.

Aktualizacja: Przykład szyfrowania przy użyciu LUKS z urządzeniem blokowym LV (test LV w systemie VG):

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

Powinno to udoskonalić blokowe urządzenie / dev / mapper / test_crypt, w którym możesz przechowywać swoje dane (po sformatowaniu ich w wybranym systemie plików).

Aby się go pozbyć, zamontuj go i użyj cryptsetup luksClose test_crypt.

Nils
źródło
Czy możesz dać MVO, aby było to łatwe do ponownego użycia? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Jeśli dobrze rozumiem, ta metoda jest szyfrowaniem na poziomie systemu plików. Szyfruje fs, którego potrzebujesz umount / mount, czy też źle to interpretuję?
2
Nie sądzę, że robi to, co myślisz. --key-fileOpcja cryptsetup wykorzystuje rzeczywistą zawartość pliku jako jeden wielki hasło. Nie czyta klucza openssl z pliku i po prostu go używa. Możesz użyć pliku losowych bajtów, --key-filejeśli chcesz.
Patrick
@ hhh Tak, to jest szyfrowanie na poziomie FS.
Nils,
4
@Nils, ale co się stanie, gdy zmieni hasło do swojego klucza prywatnego, nie będzie w stanie odszyfrować swoich plików, ponieważ zmieniły się dane w pliku klucza. --key-fileto naprawdę źle wybrana nazwa opcji, powinna być--password-file
Patrick
1
@Patrick To prawda - zmiana hasła spowoduje zmianę pliku, a tym samym klucza (z perspektywy Luksa). Ale nawet z perspektywy ssh nie nazwałbym tego plikiem haseł. Wiem, że moja odpowiedź nie trafia w sedno - ale myślę, że dostarczy kilku pomysłów.
Nils,