การเข้ารหัส 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 ที่มีเอนโทรปีอย่างน้อย 2, 048 บิตและมีอายุ 1-2 ปี คำสั่งนี้ควรสร้างทั้งคีย์หลัก (ติดป้ายกำกับ SC, สำหรับ "S'igning และ "C'ertificate Generation) และคีย์ย่อย (ติดป้ายกำกับ E สำหรับ "E'ncryption)
การกำหนดค่าไลบรารี PGP
กำลังส่งเพย์โหลด
- เมื่อลงนาม คุณควรใช้
SHA384
เป็นอัลกอริทึมสำหรับไดเจสต์ อย่าใช้SHA1
หรือMD5
- เมื่อเข้ารหัส คุณควรใช้
AES256
เป็นอัลกอริทึมการเข้ารหัสแบบสมมาตร อย่าใช้CAST5
หรือIDEA
- เมื่อเข้ารหัสหรือเซ็นชื่อข้อความ ให้เลือกคีย์ย่อยโดยมีวัตถุประสงค์ที่สอดคล้องกัน ใช้คีย์
CAN_SIGN
ในการลงชื่อและคีย์ENCRYPT_COMMS
/ENCRYPT_STORAGE
ในการเข้ารหัส
การรับเพย์โหลด
- เมื่อยืนยันเพย์โหลด ให้ตรวจสอบว่าไลบรารีรองรับอัลกอริทึมแฮชสมัยใหม่ เช่น
SHA384
โดย Google จะเริ่มใช้บริการดังกล่าวกับคีย์ใหม่ทั้งหมดตั้งแต่วันที่ 14 พฤษภาคม 2023 - เมื่อถอดรหัสเพย์โหลด ให้ตรวจสอบว่าไลบรารีรองรับอัลกอริทึมการเข้ารหัสแบบสมมาตรสมัยใหม่ เช่น
AES256
Google จะเริ่มนำไปใช้กับคีย์ใหม่ทั้งหมดในวันที่ 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 Web Encryption (JWE) เป็นมาตรฐานที่กำหนดโดย rfc7516 สำหรับการเข้ารหัสเนื้อหาในระดับแอปพลิเคชัน JSON Web Signature (JWS) เป็นมาตรฐานที่กำหนดโดย rfc7515 สำหรับการลงนามเนื้อหาในระดับแอปพลิเคชัน
คำขอและการตอบกลับจะเป็นโทเค็น JWE ที่เข้ารหัสโดยใช้การเข้ารหัสแบบอสมมาตร (คีย์สาธารณะ) ด้วยตัวเลือก "Compact Serialization" โทเค็น 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 ระหว่างการพัฒนา คุณเพียงต้องแลกเปลี่ยนคีย์แซนด์บ็อกซ์ที่ใช้สำหรับการพัฒนาและการทดสอบนอกเวอร์ชันที่ใช้งานจริงเท่านั้น ก่อนที่จะทดสอบเวอร์ชันที่ใช้งานจริงและเปิดตัว คุณจะต้องแลกเปลี่ยนคีย์ที่ใช้งานจริงอีกครั้ง