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 명령으로 인해 데이터가 변경되는 것을 막을 수는 없습니다. enc 파일에서 간단한 비트 플립으로 인해 해독 된 데이터도 손상됩니다. 위의 명령으로이를 감지 할 수 없으므로 SHA-256과 같은 양호한 체크섬으로이를 확인해야합니다. 통합 방식으로이를 수행하는 암호화 방법이 있으며이를 HMAC (해시 기반 메시지 인증 코드)라고합니다.


5
SSH 키는 비대칭 키이며 파일 암호화에 적합하지 않습니다. 결과적으로 마지막에 제공 한 명령이 작동하지 않습니다. RSA로 파일을 암호화하려고 시도하지만 RSA (모듈러스에서 패딩을 뺀 크기)로 아주 작은 페이로드 만 암호화 할 수 있습니다. 일반적인 방법은 일회용 대칭 키를 생성하고 RSA로이를 암호화하고 실제 키를 대칭 키로 암호화하는 것입니다. ssh 키를 gpg로 가져올 수 있습니다. 이것이 hhh의 요구 사항을 제대로 구현하는 방법 일 것입니다. 그러나 gpg를 gpg 키와 함께 사용하는 것이 옳은 일입니다.
Gilles 'SO- 악마 그만해'

1
대칭 -flag를 사용하여 gpg를 제안하는 이유는 무엇입니까? "gpg -e something"다른 경우 에도 작동 하지만?

1
@hhh 나는 파일을 공유하지 않을 것이라고 가정 했으므로 공개 키 암호화를 사용하는 것보다 일반 대칭을 사용하는 것이 더 안전합니다. 공개 / 개인 키 쌍 등이 필요하지 않습니다. pgp.net/pgpnet/pgp-faq/… : "여전히 RSA가 PGP 체인에서 가장 약한 링크라고 생각됩니다." 이것은 x509와 같은 다른 pubkey 메커니즘에도 적용됩니다.
vasquez

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키 파일, base64 인코딩 등과 같은 모든 옵션에 대해서는 (rh / fedora / centos에서)를 참조하십시오 .
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

그러나 Gilles가 위에서 언급했듯이 이것은 공개 키보다 작은 파일을 암호화하는 데만 적합하므로 다음과 같이 할 수 있습니다.

비밀번호를 생성하고 파일을 대칭으로 암호화 한 다음 공개 키로 비밀번호를 암호화하여 파일로 저장하십시오.

$ 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공개 키의 크기로 변경 하면됩니다.


OP의 기발한 요구 사항을 고려하면 매우 훌륭하게 수행됩니다.
rsaw

2
이 멋진 게시물 만 발견했습니다. ssh-key에서 생성 할 수있는 최대 크기 대칭 키가 ssh-key 자체보다 12 바이트 짧다는 것을 알았습니다. 그렇지 않으면 rsautl이 "key size에 비해 너무 큰 데이터"로 실패합니다. 그래서 이것은 KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')키 길이를 자동 생성하는 스크립트에서 작동했습니다 . ssh-keygen의 최소 키 길이가 768 비트 인 경우 여전히 672 비트 또는 84 바이트의 최소 대칭 키가됩니다.
markf

6

LUKS / dm-crypt와 . 적절한 옵션을 사용하여 ssh-private-key를 암호화 키로 사용할 수 있습니다.

업데이트 : LV 블록 장치에서 LUKS를 사용한 암호화 예 (VG 시스템의 LV 테스트) :

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; ...; ..."올바르게 이해할 수 있다면이 방법은 파일 시스템 수준의 암호화입니다. umount / mount가 필요한 fs를 암호화합니까? 아니면 이것을 잘못 읽습니까?

2
나는 이것이 당신이 생각하는 것을한다고 생각하지 않습니다. --key-file으로 cryptsetup에 대한 옵션은 하나의 큰 암호와 파일의 실제 내용을 사용합니다. 파일에서 openssl 키를 읽지 않고 그냥 사용하십시오. --key-file원하는 경우 임의의 바이트 파일을 사용할 수 있습니다 .
Patrick

@hhh 예 이것은 FS 수준 암호화입니다.
Nils

4
@Nils이지만 개인 키의 암호를 변경하면 어떻게됩니까? 이제 키 파일의 데이터가 변경되어 파일을 해독 할 수 없습니다. --key-file실제로 옵션에 대해 잘못 선택된 이름입니다.--password-file
Patrick

1
@Patrick 이것은 사실입니다-암호를 변경하면 파일과 키가 변경됩니다 (luks의 관점에서). 그러나 ssh의 관점에서도 암호 파일 이름을 지정하지는 않습니다. 나는 내 대답이 점수에 미치지 못한다는 것을 알고 있지만 몇 가지 아이디어를 줄 것이라고 생각합니다.
Nils
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.