Шифровать файл только с помощью SSH -priv-key?

22

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

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

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

Сообщество
источник

Ответы:

27

Я думаю, что ваше требование действительно, но с другой стороны, это также сложно, потому что вы смешиваете симметричное и асимметричное шифрование. Пожалуйста, поправьте меня, если я ошибаюсь.

Обоснование:

  1. Парольная фраза для вашего закрытого ключа предназначена для защиты вашего закрытого ключа и ничего больше.
  2. Это приводит к следующей ситуации: вы хотите использовать свой закрытый ключ для шифрования чего-то, что может расшифровать только вы. Ваш закрытый ключ не предназначен для этого, ваш открытый ключ предназначен для этого. Все, что вы шифруете своим закрытым ключом, может быть расшифровано вашим открытым ключом (подписью), это, безусловно, не то, что вы хотите. (Все, что зашифровано вашим открытым ключом, может быть расшифровано только вашим личным ключом.)
  3. Таким образом, вам нужно использовать ваш открытый ключ для шифрования ваших данных, но для этого вам не нужна ваша личная ключевая фраза для этого. Только если вы хотите расшифровать его, вам понадобится ваш личный ключ и пароль.

Вывод: в основном вы хотите повторно использовать вашу фразу-пароль для симметричного шифрования. Единственная программа, которую вы хотели бы указать в качестве пароля, - это ssh-agent, и эта программа не выполняет шифрование / дешифрование только с парольной фразой. Парольная фраза только для того, чтобы разблокировать ваш закрытый ключ и затем забыть.

Рекомендация: Используйте 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

Обновление: важно отметить, что приведенные выше команды openssl НЕ предотвращают подделку данных. Простое переключение битов в кодировочном файле также приведет к повреждению дешифрованных данных. Вышеприведенные команды не могут обнаружить это, вам нужно проверить это, например, с помощью хорошей контрольной суммы, такой как SHA-256. Существуют криптографические способы сделать это интегрированным способом, это называется HMAC (код аутентификации сообщений на основе хэша).

Васкес
источник
5
Вы правы, что ключ SSH - это асимметричный ключ, который не подходит для шифрования файла. И, как следствие, команды, которые вы предоставляете в конце, не будут работать. Вы пытаетесь зашифровать файл с помощью RSA, но вы можете зашифровать только очень маленькую полезную нагрузку с помощью RSA (размер модуля за вычетом заполнения). Обычный метод состоит в том, чтобы сгенерировать одноразовый симметричный ключ, зашифровать его с помощью RSA и зашифровать реальные данные с помощью симметричного ключа. Может быть возможно импортировать ключ ssh в gpg, это был бы разумный способ выполнить требование hhh - но использование gpg с ключом gpg - правильная вещь.
Жиль "ТАК ... перестать быть злым"
1
Почему вы предлагаете gpg с симметричным флагом? Это работает также с, "gpg -e something"но для разных случаев?
1
@hhh Я предполагал, что вы не будете делиться своими файлами, поэтому использование простой симметрии более безопасно, чем использование криптографии с открытым ключом. Нет необходимости в публичной / частной паре ключей и т. Д. От pgp.net/pgpnet/pgp-faq/… : «до сих пор считается, что RSA является самым слабым звеном в цепи PGP». Это также относится к другим механизмам pubkey, таким как x509.
Васкес
1
Как будет выглядеть openssl-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) все параметры, такие как ключевые файлы, 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бы размер вашего открытого ключа.

kwarrick
источник
Очень хорошо сделано, учитывая причудливые требования ОП.
RSA
2
только что нашел это, хороший пост. Я обнаружил, что максимальный размер симметричного ключа, который вы можете сгенерировать из ssh-ключа, на 12 байт короче самого ssh-ключа, иначе rsautl потерпит неудачу с «данными, слишком большими для размера ключа». Так что это работало в скрипте: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')чтобы автоматически определить длину ключа. Учитывая, что ssh-keygen имеет минимальную длину ключа 768 битов, это все равно приводит к минимальному симметричному ключу 672 битов, или 84 байта.
markf 18.12.12
6

Посмотрите на luks / dm-crypt . Вы можете использовать ваш 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.

Nils
источник
Не могли бы вы дать MVO сделать так, чтобы его было легко использовать повторно? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Если я правильно понимаю, этот метод является шифрованием на уровне файловой системы. Он зашифровывает фс, который вам нужен umount / mount, или я неправильно это читаю?
2
Я не думаю, что это делает то, что вы думаете, что делает. --key-fileВариант Cryptsetup использует фактическое содержимое файла в виде одного большого пароля. Он не читает ключ openssl из файла и просто использует его. Вы можете использовать файл случайных байтов, --key-fileесли хотите.
Патрик
@hhh Да, это шифрование на уровне FS.
Нильс
4
@ Nils, но что происходит, когда он меняет пароль на своем закрытом ключе, он теперь не сможет расшифровать свои файлы, так как данные в файле ключа изменились. --key-fileдействительно плохо выбранное имя для варианта, оно должно быть--password-file
Patrick
1
@Patrick Это правда - изменение ключевой фразы изменит файл и, следовательно, ключ (с точки зрения удачи). Но даже с точки зрения ssh я бы не назвал это паролем. Я знаю, что мой ответ не попал в цель - но я думаю, что он даст некоторые идеи.
Нильс