Шифрувати файл лише за допомогою SSH -priv-ключа?


22

Припустимо, я хочу зашифрувати файл, щоб тільки я міг його читати, знаючи свій пароль приватного ключа SSH. Я ділюсь репо, де я хочу зашифрувати або придушити конфіденційну інформацію. Маючи на увазі, я маю на увазі, що репо містить інформацію, але я відкриватиму її лише в особливих випадках.

  1. Припустимо, я використовую SSH-агент, чи є якийсь простий спосіб зашифрувати файл лише для мене, щоб відкрити його пізніше?

  2. Я не бачу, чому я повинен використовувати GPG для цього, питання тут ; в основному я знаю пароль і хочу лише розшифрувати файл тим самим паролем, що і мій ключ SSH. Чи можливо це?

Відповіді:


27

Я думаю, що ваша вимога є дійсною, але, з іншого боку, це також важко, оскільки ви змішуєте симетричне та асиметричне шифрування. Будь ласка, виправте мене, якщо я помиляюся.

Обґрунтування:

  1. Західна фраза для вашого приватного ключа полягає у захисті вашого приватного ключа та нічого іншого.
  2. Це призводить до наступної ситуації: Ви хочете використовувати свій приватний ключ для шифрування чогось, що тільки ви можете розшифрувати. Ваш приватний ключ не призначений для цього, ваш відкритий ключ є для цього. Все, що ви шифруєте своїм приватним ключем, може бути розшифровано вашим відкритим ключем (підписанням), це точно не те, що ви хочете. (Що б не було зашифровано вашим відкритим ключем, можна розшифрувати лише ваш приватний ключ.)
  3. Тож вам потрібно використовувати ваш відкритий ключ для шифрування даних, але для цього вам не потрібна парольна фраза для приватного ключа. Тільки якщо ви хочете розшифрувати його, вам знадобиться ваш приватний ключ та пароль.

Висновок. В основному ви хочете повторно використовувати свою парольну фразу для симетричного шифрування. Єдина програма, якій ви хочете дати свою парольну фразу, - це ssh-агент, і ця програма не робить шифрування / дешифрування лише за допомогою парольної фрази. Парольна фраза є лише там, щоб розблокувати ваш приватний ключ, а потім забути.

Рекомендація: Використовуйте для шифрування openssl encабо gpg -e --symmetricзахищені паролем фразові ключові файли. Якщо вам потрібно поділитися інформацією, ви можете використовувати інфраструктуру відкритих ключів обох програм для створення PKI / Web of Trust.

З openssl щось подібне:

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

і дешифрування чогось подібного

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

Оновлення: Важливо зазначити, що вищезазначені команди opensl НЕ перешкоджають підробці даних. Просте бітне перевертання у файлі enc призведе до пошкодження дешифрованих даних. Наведені вище команди не можуть цього виявити, вам потрібно перевірити це, наприклад, з хорошою контрольною сумою на зразок SHA-256. Існують криптографічні способи зробити це комплексно, це називається HMAC (Код аутентифікації повідомлень на основі Hash).


5
Ви праві, що ключ SSH - це асиметричний ключ, не підходить для шифрування файлу. І як наслідок, команди, які ви надаєте наприкінці, не спрацюють. Ви намагаєтеся зашифрувати файл за допомогою RSA, але ви можете зашифрувати лише дуже невелику корисну навантаження за допомогою RSA (розмір модуля мінус прокладка). Нормальний метод - це генерувати одноразовий симетричний ключ, шифрувати його за допомогою RSA та шифрувати реальні дані симетричним ключем. Можливо, імпортувати ключ ssh у gpg, це був би розумний спосіб реалізувати вимогу hhh - але використання gpg за допомогою gpg ключа - це правильно зробити.
Жил "ТАК - перестань бути злим"

1
Чому ви пропонуєте gpg із симетричним флагом? Це також працює, "gpg -e something"але для різних випадків?

1
@hhh Я припускав, що ви не поділитесь своїми файлами, тому використання простої симетричної є більш безпечним, ніж використання криптографії відкритого ключа. Немає потреби в державному / приватному ключі тощо. З pgp.net/pgpnet/pgp-faq/… : "все ще вважається, що RSA є найслабшою ланкою в ланцюзі PGP". Це також стосується інших механізмів віскі, таких як x509.
vasquez

1
Як виглядатиме Opensl-one-liner? Щось еквівалентне $ gpg -e --symmetric?

1
Використовуйте це для шифрування:, openssl enc -aes-256-cbc -in my.pdf -out mydata.encрозшифруйте за допомогою: openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfобидві команди запитують пароль. Дивіться man enc(на rh / fedora / centos) для всіх варіантів, таких як keyfiles, кодування base64 тощо
vasquez

21

Я вважаю за краще скористатися opensslутилітою, оскільки це здається досить всюдисущим.

Перетворення відкритого ключа та приватного ключа RSA у формат 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

Шифрування файлу за допомогою відкритого ключа:

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

Розшифрування файлу за допомогою приватного ключа:

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

Але, як коментує Жилл вище, це підходить лише для шифрування файлів, менших за ваш відкритий ключ, тому ви можете зробити щось подібне:

Створіть пароль, зашифруйте файл із ним симетрично та зашифруйте пароль своїм загальнодоступним, зберігаючи його у файлі:

$ 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

Розшифруйте парольну фразу за допомогою приватного ключа та використовуйте її для розшифрування файлу:

$ 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

Ви отримаєте два файли, ваш зашифрований файл та зашифровану парольну фразу, але вкладений у сценарій це буде добре працювати.

Ви навіть можете додати tar cvf file file.enc file.enc.keyприбирання.

Оптимально, ви максимально збільшите розмір вашої парольної фрази, а також змінивши rand 64розмір відкритого ключа.


Дуже добре зроблено, враховуючи вигадливі вимоги ОП.
rsaw

2
тільки що знайшов це, приємний пост. Я виявив, що симетричний ключ максимального розміру, який ви можете генерувати за допомогою ssh-ключа, на 12 байт коротший, ніж сам ssh-ключ, інакше rsautl не зможе отримати "дані занадто великі для розміру ключа". Таким чином, це працювало в сценарії: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')для автоматичного встановлення довжини ключа. Враховуючи, що ssh-keygen має мінімальну довжину ключа 768 біт, це все одно призводить до мінімального симетричного ключа 672 біт або 84 байта.
Маркф

6

Подивіться на luks / dm-склеп . Ви можете використовувати свій ssh-private-ключ як ключ шифрування, скориставшись відповідною опцією.

Оновлення: Приклад шифрування за допомогою LUKS з пристроєм LV-блоку (тест LV в системі VG):

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

Це повинно створити блок-пристрій / dev / mapper / test_crypt, на якому ви можете використовувати для зберігання своїх даних (після форматування їх у вибраній вами файловій системі).

Щоб позбутися від нього, промацуйте його та використовуйте cryptsetup luksClose test_crypt.


Чи можете ви дозволити MVO зробити це, щоб його легко повторно використовувати? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Якщо я можу правильно зрозуміти, цей метод - це шифрування на рівні файлової системи. Він шифрує fs, які вам потрібні umount / mount, чи я це неправильно читаю?

2
Я не думаю, що це робить те, що ви думаєте, що це робить. --key-fileВаріант Cryptsetup використовує фактичний вміст файлу в вигляді одного великого пароля. Він не читає ключ openssl з файлу і просто використовує його. --key-fileЯкщо ви хочете, ви можете використовувати файл випадкових байтів .
Патрік

@hhh Так, це шифрування на рівні FS.
Нілс

4
@Nils, але що станеться, коли він змінить пароль свого приватного ключа, він тепер не зможе розшифрувати свої файли, оскільки дані у файлі ключів змінені. --key-fileнасправді погано вибране ім'я для варіанту, воно повинно бути--password-file
Патрік

1
@Patrick Це правда - зміна парольної фрази змінить файл і, таким чином, ключ (з точки зору лукс). Але навіть з точки зору ssh я б не назвав його файлом паролів. Я знаю, що моя відповідь не потрапляє у позначку - але я думаю, що це дасть деякі ідеї.
Нілс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.