การเข้ารหัส PGP
PGP เป็นชุดอัลกอริทึมการเข้ารหัส การถอดรหัส และการลงนามมาตรฐานที่ ให้ความเป็นส่วนตัวและการตรวจสอบสิทธิ์ด้วยการเข้ารหัสลับ
เมื่อใช้ PGP เพื่อเข้ารหัสเพย์โหลด พาร์ทเนอร์ต้องรองรับสิ่งต่อไปนี้
- การเข้ารหัสและถอดรหัสเพย์โหลดด้วยคีย์ PGP หลายรายการ
- การลงนามเพย์โหลดด้วยคีย์ PGP หลายรายการ
- การยืนยันเพย์โหลดด้วยลายเซ็นหลายรายการ ซึ่งลายเซ็นใดก็ได้อาจเป็น ลายเซ็นที่มีคีย์ที่ Google ให้ไว้
- การถอดรหัสเพย์โหลดที่เข้ารหัส Web-safe base64
คีย์สาธารณะ PGP ที่ระบุต่อ Google ต้องมีคีย์ย่อยที่ใช้สำหรับการเข้ารหัส คีย์ย่อยช่วยให้หมุนเวียนคีย์ได้อย่างอิสระจากคีย์หลัก โดยจะใช้คีย์หลัก สำหรับการยืนยันตัวตน คีย์ส่วนตัวต้องเป็นคีย์ RSA ขนาด 2048 บิต (หรือมากกว่า) ที่หมดอายุใน 1 ปี โดยมีอายุการใช้งานสูงสุด 2 ปี
ก่อนเริ่มการพัฒนา คุณต้องแลกเปลี่ยนคีย์ PGP กับ Google ในขั้นตอนนี้ คุณจะสร้างคู่คีย์สาธารณะ-ส่วนตัวของ PGP ให้คีย์สาธารณะแก่ Google และรับคีย์สาธารณะจาก Google ในระหว่างการพัฒนา คุณจะต้องแลกเปลี่ยนคีย์แซนด์บ็อกซ์ที่ใช้สำหรับการพัฒนาและการทดสอบ นอกเหนือจากเวอร์ชันที่ใช้งานจริงเท่านั้น ก่อนการทดสอบเวอร์ชันที่ใช้งานจริงและการเปิดตัว คุณจะต้อง แลกเปลี่ยนคีย์เวอร์ชันที่ใช้งานจริงอีกครั้ง
การสร้างคีย์ PGP ใหม่
หากมีไบนารี GPG ในเส้นทางของระบบ คุณจะใช้คำสั่ง POSIX ต่อไปนี้เพื่อสร้างคู่คีย์ใหม่ได้
$ gpg --full-generate-key
เมื่อได้รับข้อความแจ้ง ให้เลือกคีย์ RSA ที่มี Entropy อย่างน้อย 2048 บิตและ วันหมดอายุ 1-2 ปี คำสั่งนี้ควรสร้างทั้งคีย์หลัก (มีป้ายกำกับ SC สำหรับการสร้าง "S"igning และ "C"ertificate) และคีย์ย่อย (มีป้ายกำกับ E สำหรับ "E"ncryption)
การกำหนดค่าไลบรารี PGP
การส่งเพย์โหลด
- เมื่อลงนาม คุณควรใช้
SHA384เป็นอัลกอริทึมสำหรับไดเจสต์ แต่อย่าใช้SHA1หรือMD5 - เมื่อเข้ารหัส คุณควรใช้
AES256เป็นอัลกอริทึมการเข้ารหัสแบบสมมาตร อย่าใช้CAST5หรือIDEA - เมื่อเข้ารหัสหรือลงนามข้อความ ให้เลือกคีย์ย่อยที่มีวัตถุประสงค์ที่เกี่ยวข้อง ใช้คีย์
CAN_SIGNสำหรับการลงนาม และคีย์ENCRYPT_COMMS/ENCRYPT_STORAGEสำหรับการเข้ารหัส
การรับเพย์โหลด
- เมื่อยืนยันเพย์โหลด โปรดตรวจสอบว่าไลบรารีรองรับแฮช
อัลกอริทึมที่ทันสมัย เช่น
SHA384Google จะเริ่มใช้คีย์นี้กับคีย์ใหม่ทั้งหมดตั้งแต่วันที่ 14 พฤษภาคม 2023 - เมื่อถอดรหัสเพย์โหลด โปรดตรวจสอบว่าไลบรารีของคุณรองรับอัลกอริทึมการเข้ารหัสแบบสมมาตรสมัยใหม่ เช่น
AES256Google จะเริ่มใช้คีย์ดังกล่าวกับคีย์ใหม่ทั้งหมด ตั้งแต่วันที่ 14 พฤษภาคม 2023
ตัวอย่างการเข้ารหัสเพย์โหลด GPG
คำสั่งต่อไปนี้เป็นตัวอย่างวิธีเลือกตัวเลือกที่ปลอดภัยเมื่อใช้ GPG คาดว่าการดำเนินการนี้จะดำเนินการในสภาพแวดล้อมที่เชื่อถือได้ ซึ่งผู้ใช้จะไม่มีสิทธิ์เข้าถึงคีย์ส่วนตัวหรือไฟล์อินพุตที่ละเอียดอ่อน
gpg --output signed-and-encrypted.pgp \
--sign --digest-algo SHA384 \
--encrypt --cipher-algo AES256 \
--armor \
--recipient {key_id} \
input.txt
GPG จะเลือกคีย์ที่ถูกต้องจากชุดคีย์โดยอัตโนมัติสำหรับการดำเนินการแต่ละอย่าง ที่คุณขอให้ดำเนินการ
การเข้ารหัส JWE ด้วยการลงนาม JWS
การเข้ารหัสเว็บ JSON (JWE) เป็นมาตรฐานที่กำหนดโดย rfc7516 สำหรับการเข้ารหัสเนื้อหาที่ระดับแอปพลิเคชัน JSON Web Signature (JWS) เป็นมาตรฐานที่กำหนดโดย rfc7515 สำหรับการลงนามเนื้อหาที่ ระดับแอปพลิเคชัน
คำขอและการตอบกลับจะเป็นโทเค็น JWE ที่เข้ารหัสโดยใช้การเข้ารหัสแบบอสมมาตร (คีย์สาธารณะ) ด้วยตัวเลือก "การทำให้เป็นอนุกรมแบบกะทัดรัด" โทเค็น JWE จะมีเพย์โหลดที่ลงชื่อเป็นโทเค็น JWS นอกจากนี้ JWS ยังใช้คีย์แบบอสมมาตร คีย์ส่วนตัวสำหรับการลงนามและคีย์สาธารณะสำหรับการยืนยัน
เมื่อส่งเพย์โหลด ให้ลงนามเพย์โหลดก่อน แล้วจึงเข้ารหัส เมื่อ ได้รับเพย์โหลด ให้ถอดรหัสก่อน แล้วจึงยืนยันลายเซ็น
เมื่อใช้ JWE พาร์ทเนอร์ต้องรองรับตัวเลือกต่อไปนี้
- การทำให้เป็นอนุกรมแบบกะทัดรัด
- การถอดรหัสเพย์โหลดจากคีย์ JWE รายการใดรายการหนึ่งจากหลายรายการ
- อัลกอริทึม RSA-OAEP, RSA-OAEP-256 หรือ ECDH-ES สำหรับการจัดการคีย์
- ป้อนข้อมูลในส่วนหัว
alg(rfc7518 ส่วนที่ 4.1)
- ป้อนข้อมูลในส่วนหัว
- อัลกอริทึม A256GCM,
A128GCM,
A128CBC-HS256 หรือ
A256CBC-HS512
สำหรับการเข้ารหัสเนื้อหา
- แสดงในส่วนหัวของ
enc
- แสดงในส่วนหัวของ
kidเพื่อระบุคีย์การเข้ารหัสสาธารณะ- เพย์โหลดของข้อความที่ใช้การเข้ารหัส JWE ต้องใช้ประเภทเนื้อหา application/jose; charset=utf-8
เมื่อใช้ JWS พาร์ทเนอร์ต้องรองรับตัวเลือกต่อไปนี้
- การทำให้เป็นอนุกรมแบบกะทัดรัด
- การยืนยันเพย์โหลดจากคีย์ JWS อย่างใดอย่างหนึ่งจากหลายคีย์
- อัลกอริทึม HS256, HS384, HS512,
RS256, RS384, RS512, ES256, PS256, PS384 หรือ PS512 สำหรับการสร้างลายเซ็น
- ป้อนข้อมูลในส่วนหัว
alg(rfc 7518 ส่วนที่ 3.1)
- ป้อนข้อมูลในส่วนหัว
kidในส่วนหัวเพื่อระบุคีย์การลงนามส่วนตัว
สตริง JWE/JWS จะได้รับการเข้ารหัสเป็นสตริง UTF-8 และเพย์โหลดอาจเป็นไบต์ใดก็ได้
คีย์ส่วนตัวต้องเป็นคีย์ RSA/ECDH-ES ที่หมดอายุใน 1 ปี โดยมีอายุการใช้งานสูงสุด 2 ปี ข้อมูลประจำตัวของคีย์ส่วนตัวทั้งหมดต้องอยู่บนเซิร์ฟเวอร์ของพาร์ทเนอร์เสมอ และค่าลายเซ็นทั้งหมดต้องคำนวณบนเซิร์ฟเวอร์ของพาร์ทเนอร์
ก่อนเริ่มการพัฒนา คุณต้องแลกเปลี่ยนคีย์ JWE และ JWS กับ Google ควรแลกเปลี่ยนคีย์ในรูปแบบ JWK ตามที่กำหนดไว้ใน rfc7517 ในขั้นตอนนี้ คุณจะสร้างคู่คีย์สาธารณะ-ส่วนตัว ให้คีย์สาธารณะแก่ Google และรับคีย์สาธารณะจาก Google ในระหว่างการพัฒนา คุณจะต้องแลกเปลี่ยนคีย์แซนด์บ็อกซ์ที่ใช้สำหรับการพัฒนาและการทดสอบ นอกเหนือจากเวอร์ชันที่ใช้งานจริงเท่านั้น ก่อนการทดสอบเวอร์ชันที่ใช้งานจริงและการเปิดตัว คุณจะต้อง แลกเปลี่ยนคีย์เวอร์ชันที่ใช้งานจริงอีกครั้ง