เข้ารหัสไฟล์ด้วย SSH -priv-key เท่านั้นหรือ


22

สมมติว่าฉันต้องการเข้ารหัสไฟล์เพื่อให้มีเพียงฉันเท่านั้นที่สามารถอ่านได้โดยรู้รหัสผ่านส่วนตัวของ SSH ฉันแบ่งปัน repo ที่ฉันต้องการเข้ารหัสหรือทำให้ข้อมูลอ่อนไหว โดยที่ฉันหมายถึงว่า repo จะมีข้อมูล แต่ฉันจะเปิดเฉพาะในกรณีพิเศษ

  1. สมมติว่าฉันใช้ตัวแทน SSH มีวิธีง่าย ๆ ในการเข้ารหัสไฟล์เพื่อให้ฉันเท่านั้นที่จะเปิดในภายหลัง?

  2. ฉันไม่สามารถดูว่าทำไมฉันจึงควรใช้จีพีจีสำหรับนี้คำถามที่นี่ ; โดยพื้นฐานฉันรู้รหัสผ่านและฉันต้องการถอดรหัสไฟล์ด้วยรหัสผ่านเดียวกับคีย์ 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 แต่คุณสามารถเข้ารหัส payload ขนาดเล็กมากได้ด้วย RSA (ขนาดของโมดูลัสลบด้วยการแพ็ดดิง) วิธีปกติคือการสร้างคีย์ symmetric แบบใช้ครั้งเดียวเข้ารหัสด้วย RSA และเข้ารหัสข้อมูลจริงด้วยคีย์ symmetric อาจเป็นไปได้ที่จะนำเข้าคีย์ ssh ใน gpg ซึ่งจะเป็นวิธีที่มีสติในการนำข้อกำหนดของ hhh ไปใช้ แต่การใช้ gpg กับคีย์ gpg เป็นสิ่งที่ถูกต้อง
Gilles 'ดังนั้นหยุดความชั่วร้าย'

1
ทำไมคุณถึงแนะนำ gpg ด้วย symmetric -flag? มันใช้ได้กับ"gpg -e something"แต่สำหรับกรณีที่แตกต่างกันอย่างไร

1
@hhh ฉันคิดว่าคุณจะไม่แชร์ไฟล์ของคุณดังนั้นการใช้เพียงสมมาตรแบบธรรมดาจึงมีความปลอดภัยมากกว่าการใช้การเข้ารหัสแบบพับลิกคีย์ ไม่จำเป็นต้องมีคีย์สาธารณะ / ส่วนตัว ฯลฯ จากpgp.net/pgpnet/pgp-faq/… : "ยังเชื่อว่า RSA เป็นลิงค์ที่อ่อนแอที่สุดในห่วงโซ่ PGP" นอกจากนี้ยังนำไปใช้กับกลไก pubkey อื่น ๆ เช่น x509
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(บน 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

แต่ตามที่ 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 คือ 12 ไบต์ที่สั้นกว่า ssh-key เองมิฉะนั้น rsautl จะล้มเหลวด้วย "ข้อมูลมีขนาดใหญ่เกินไปสำหรับขนาดคีย์" ดังนั้นสิ่งนี้จึงทำงานในสคริปต์: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')เพื่อสร้างความยาวของกุญแจ เนื่องจาก ssh-keygen นั้นมีความยาวของคีย์ต่ำสุดที่ 768 บิตซึ่งจะนำไปสู่คีย์สมมาตรขั้นต่ำ 672 บิตหรือ 84 ไบต์
markf

6

ดูที่Luks / DM-ฝังศพใต้ถุนโบสถ์ คุณสามารถใช้ ssh-private-key เป็นคีย์การเข้ารหัสโดยใช้ตัวเลือกที่เหมาะสม

อัปเดต: ตัวอย่างการเข้ารหัสโดยใช้ LUKS ด้วยอุปกรณ์ LV-block-device (ทดสอบ 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ซึ่งคุณสามารถใช้เพื่อเก็บข้อมูลของคุณบน (หลังจากการจัดรูปแบบด้วยระบบไฟล์ที่คุณเลือก)

เพื่อกำจัดมัน umount 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หากต้องการ
Patrick

@hhh ใช่นี่คือการเข้ารหัสระดับ FS
นิลส์

4
@ ไม่มีอะไรเกิดขึ้นเมื่อเขาเปลี่ยนรหัสผ่านในรหัสส่วนตัวของเขาตอนนี้เขาจะไม่สามารถถอดรหัสไฟล์ของเขาได้เนื่องจากข้อมูลในไฟล์คีย์เปลี่ยนไป --key-fileเป็นชื่อที่ได้รับการคัดเลือกไม่ดีจริงๆสำหรับตัวเลือกมันควรเป็น--password-file
Patrick

1
@ แพทริคนี้เป็นจริง - การเปลี่ยนวลีรหัสผ่านจะเปลี่ยนไฟล์และทำให้คีย์ (จากมุมมองของลุค) แต่แม้จากมุมมองของ ssh ฉันจะไม่ตั้งชื่อไฟล์รหัสผ่าน ฉันรู้ว่าคำตอบของฉันไม่ได้ทำเครื่องหมาย - แต่ฉันคิดว่ามันจะให้ความคิดบางอย่าง
นิลส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.