Şifreleme sadece SSH şifresiyle mi?


22

SSH özel anahtar şifremi bilerek bir dosyayı yalnızca okuyabilmem için şifrelemek istediğimi varsayalım. Hassas bilgileri şifrelemek veya gizlemek istediğim bir depoyu paylaşıyorum. Bu sayede, deponun bilgileri içereceğini ancak sadece özel durumlarda açacağımı kastediyorum.

  1. SSH-ajanı kullandığımı varsayalım, dosyayı daha sonra açmam için dosyayı şifrelemenin kolay bir yolu var mı?

  2. Bunun için neden GPG kullanmam gerektiğini anlamıyorum, buradaki soru ; temelde şifreyi biliyorum ve sadece SSH anahtarımla aynı şifreyle dosyanın şifresini çözmek istiyorum. Mümkün mü?

Yanıtlar:


27

İhtiyaçlarınızın geçerli olduğunu düşünüyorum ama diğer yandan da zor, çünkü simetrik ve asimetrik şifrelemeyi karıştırıyorsunuz. Yanılıyorsam lütfen beni düzeltin.

Akıl Yürütme:

  1. Özel anahtarınızın şifresi, özel anahtarınızı ve başka hiçbir şeyi korumanızdır.
  2. Bu şu duruma yol açar: Özel şifrenizi yalnızca şifresini çözebileceğiniz bir şeyi şifrelemek için kullanmak istersiniz. Özel anahtarınız bunun için tasarlanmadı, ortak anahtarınız bunu yapmak için orada. Özel anahtarınızla şifreleyen her şey, genel anahtarınızla (imza) şifrelenebilir, kesinlikle istediğiniz şey bu değildir. (Genel anahtarınızla şifrelenen her şey yalnızca özel anahtarınızla şifrelenebilir.)
  3. Dolayısıyla, verilerinizi şifrelemek için genel anahtarınızı kullanmanız gerekir, ancak bunun için bunun için özel anahtar parolanıza ihtiyacınız yoktur. Sadece şifresini çözmek istiyorsanız, özel anahtarınıza ve parolanıza ihtiyacınız olacaktır.

Sonuç: Temel olarak simetrik şifreleme için parolanızı tekrar kullanmak istiyorsunuz. Parolanızı vermek istediğiniz tek program ssh-agent'tır ve bu program şifreleme / şifre çözme işlemlerini yalnızca parola ile yapmaz. Parola yalnızca özel anahtarınızın kilidini açmak için orada bulunur ve sonra unutulur.

Öneri: Şifreleme için parola korumalı anahtar dosyalar kullanın openssl encveya kullanın gpg -e --symmetric. Bilgileri paylaşmanız gerekirse, bir PKI / Web Güven oluşturmak için her iki programın ortak anahtar altyapısını kullanabilirsiniz.

Openssl ile şunun gibi bir şey:

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

ve şifre çözme gibi bir şey

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

Güncelleme: Yukarıdaki openssl komutlarının verilerin tahrif edilmesini önlemediğini not etmek önemlidir. Enc dosyasındaki basit bir bit çevirme deşifre edilmiş verilerin de bozulmasına neden olur. Yukarıdaki komutlar bunu algılayamaz, örneğin SHA-256 gibi iyi bir sağlama toplamıyla kontrol etmeniz gerekir. Bunu entegre bir şekilde yapmanın şifreleme yolları vardır, buna HMAC (Karma Tabanlı İleti Kimlik Doğrulama Kodu) denir.


5
Bir SSH anahtarının bir dosyayı şifrelemek için uygun olmayan bir asimetrik anahtar olduğu konusunda haklısınız. Sonuç olarak, sonunda verdiğiniz komutlar çalışmaz. Bir dosyayı RSA ile şifrelemeye çalışıyorsunuz, ancak RSA ile çok küçük bir taşıma yükünü şifreleyebilirsiniz (modül eksi dolgu boyutu). Normal yöntem, tek kullanımlık bir simetrik anahtar üretmek, bunu RSA ile şifrelemek ve gerçek verileri simetrik anahtarla şifrelemek. Ssh anahtarını gpg olarak almak mümkün olabilir, bu hhh gereksinimini yerine getirmenin aklı başında bir yoldur - ancak gpg'yi gpg anahtarıyla kullanmak doğru bir şeydir.
Gilles 'SO- kötülükten

1
Neden simetrik-işaretli gpg'yi önerirsiniz? Aynı zamanda "gpg -e something"farklı durumlar için de çalışır ?

1
@ hhh Dosyalarınızı paylaşmayacağınızı varsaydım, bu nedenle sadece düz simetrik kullanmak, genel anahtar şifreleme kullanmaktan daha güvenlidir. Kamuya açık / özel keypair vs.'ye gerek yok. Pgp.net/pgpnet/pgp-faq/… 'den : "hala RSA'nın PGP zincirindeki en zayıf halka olduğuna inanılıyor." Bu aynı zamanda x509 gibi diğer pubkey mekanizmaları için de geçerlidir.
vasquez

1
Openssl-one-liner neye benzerdi? Eşdeğer bir şey $ gpg -e --symmetric?

1
Bunu şifrelemek için kullanın:, openssl enc -aes-256-cbc -in my.pdf -out mydata.encşifresini çözmek: openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfher iki komut da şifreyi ister. man encKeyfile, base64 kodlaması vb. Tüm seçenekler için bkz. (Rh / fedora / centos'ta)
vasquez

21

opensslFaydalı her yerde göründüğü gibi yardımcı programı kullanmayı tercih ederdim .

RSA ortak anahtarını ve özel anahtarını PEM formatına dönüştürün:

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
$ openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > id_rsa.pub.pem

Bir dosyayı ortak anahtarınızla şifrelemek:

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

Dosyanın şifresini özel anahtarınızla çözme:

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

Ancak, Gilles'un yukarıda yorumladığı gibi, yalnızca genel anahtarınızdan daha küçük dosyaları şifrelemek için uygundur, bu nedenle şöyle bir şey yapabilirsiniz:

Bir şifre oluşturun, dosyayı onunla simetrik olarak şifreleyin ve şifreyi herkese şifreleyin, anahtar dosyaya kaydedin:

$ 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

Parolanın şifresini özel anahtarınızla şifreleyin ve dosyayı şifresini çözmek için kullanın:

$ 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

Şifrelenmiş dosyanız ve şifrelenmiş parolanız olmak üzere iki dosya ile sonlanırsınız, ancak bir betik içerisine koymanız iyi sonuç verir.

tar cvf file file.enc file.enc.keyToparlamak için bir bile ekleyebilirsiniz .

Optimal olarak, rand 64ortak anahtarınızın boyutuna geçmenin yanı sıra parolanızın boyutunu en üst düzeye çıkarırsınız .


OP'nin ilginç gereklilikleri göz önüne alındığında, çok güzel bitti.
saat

2
sadece sadece bu güzel yazı bulundu. Ssh anahtarından oluşturabileceğiniz maksimum boyut simetrik anahtarının ssh anahtarının kendisinden 12 bayt daha kısa olduğunu gördüm, aksi takdirde rsautl "anahtar boyutu için çok büyük veri" ile başarısız olur. Böylece bu bir betikte çalıştı: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')anahtar uzunluğunu otomatikleştirmek. Verilen ssh-keygen minimum 768 bitlik bir anahtar uzunluğuna sahiptir, bu hala 672 bitlik veya 84 baytlık minimum simetrik anahtara yol açar.
işaret

6

Luks / dm-crypt'a bak . Uygun seçeneği kullanarak ssh-private-key'inizi şifreleme anahtarı olarak kullanabilirsiniz.

Güncelleme: LV-blok cihazlı LUKS kullanarak örnek şifreleme (VG sisteminde LV testi):

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

Bu , verilerinizi depolamak için kullanabileceğiniz bir blok aygıtı / dev / mapper / test_crypt öğütmesini sağlamalıdır (seçtiğiniz bir dosya sistemiyle biçimlendirdikten sonra).

Ondan kurtulmak için onu toplayın ve kullanın cryptsetup luksClose test_crypt.


Yeniden kullanımı kolay olması için MVO'yu verebilecek misiniz? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Doğru anlayabilirsem, bu yöntem dosya sistemi düzeyinde bir şifrelemedir. İhtiyacınız olan fs / mount'ları şifreliyor mu yoksa yanlış mı okuyorum?

2
Sandığın gibi yaptığını sanmıyorum. --key-fileCryptsetup seçeneği tek bir büyük şifre olarak dosyanın gerçek içeriğini kullanır. Openssl anahtarını dosyadan okumaz ve sadece onu kullanır. İsterseniz rastgele baytlık bir dosya kullanabilirsiniz --key-file.
Patrick

@ hhh Evet, bu bir FS düzeyinde şifrelemedir.
Nils

4
@Nils, ancak özel anahtarındaki parolayı değiştirdiğinde ne olur, artık anahtar dosyadaki veriler değiştikçe dosyalarının şifresini çözemez. --key-fileseçenek için gerçekten kötü seçilmiş bir isim, öyle olmalı--password-file
Patrick

1
@Patrick Bu doğrudur - parolayı değiştirmek dosyayı ve dolayısıyla anahtarı değiştirir (luks perspektifinden). Ancak ssh açısından bile bir şifre dosyası adı vermem. Cevabımın işareti vurmadığını biliyorum - ancak bazı fikirler sağlayacağını düşünüyorum.
Nils
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.