การเข้ารหัสเลเยอร์ของแอปพลิเคชัน

API การชำระเงินมาตรฐานรองรับ PGP หรือ JWE สำหรับการเข้ารหัสเลเยอร์ของแอปพลิเคชัน

การเข้ารหัส 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

กำลังส่งเพย์โหลด

  1. เมื่อลงนาม คุณควรใช้ SHA384 เป็นอัลกอริทึมสำหรับไดเจสต์ อย่าใช้ SHA1หรือ MD5
  2. เมื่อเข้ารหัส คุณควรใช้ AES256 เป็นอัลกอริทึมการเข้ารหัสแบบสมมาตร อย่าใช้ CAST5 หรือ IDEA
  3. เมื่อเข้ารหัสหรือเซ็นชื่อข้อความ ให้เลือกคีย์ย่อยโดยมีวัตถุประสงค์ที่สอดคล้องกัน ใช้คีย์ CAN_SIGN ในการลงชื่อและคีย์ ENCRYPT_COMMS/ENCRYPT_STORAGE ในการเข้ารหัส

การรับเพย์โหลด

  1. เมื่อยืนยันเพย์โหลด ให้ตรวจสอบว่าไลบรารีรองรับอัลกอริทึมแฮชสมัยใหม่ เช่น SHA384 โดย Google จะเริ่มใช้บริการดังกล่าวกับคีย์ใหม่ทั้งหมดตั้งแต่วันที่ 14 พฤษภาคม 2023
  2. เมื่อถอดรหัสเพย์โหลด ให้ตรวจสอบว่าไลบรารีรองรับอัลกอริทึมการเข้ารหัสแบบสมมาตรสมัยใหม่ เช่น 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 สำหรับการจัดการคีย์
  • อัลกอริทึม 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 สำหรับการสร้างลายเซ็น
  • ส่วนหัว kid เพื่อระบุคีย์การลงนามส่วนตัว

สตริง JWE/JWS จะเข้ารหัสเป็นสตริง UTF-8 และเพย์โหลดอาจเป็นไบต์ที่กำหนดเอง

คีย์ส่วนตัวต้องเป็นคีย์ RSA/ECDH-ES ซึ่งมีอายุ 1 ปีโดยมีอายุการใช้งานสูงสุด 2 ปี ข้อมูลประจำตัวของคีย์ส่วนตัวทั้งหมดต้องอยู่ในเซิร์ฟเวอร์ของพาร์ทเนอร์เสมอ และต้องคำนวณค่าลายเซ็นทั้งหมดบนเซิร์ฟเวอร์ของพาร์ทเนอร์

ก่อนเริ่มการพัฒนา คุณต้องแลกเปลี่ยนคีย์ JWE และ JWS กับ Google ควรแลกเปลี่ยนคีย์ในรูปแบบ JWK ตามที่กำหนดไว้ใน rfc7517 ในขั้นตอนนี้ คุณจะสร้างคู่คีย์สาธารณะ-ส่วนตัว ให้คีย์สาธารณะกับ Google และรับคีย์สาธารณะจาก Google ระหว่างการพัฒนา คุณเพียงต้องแลกเปลี่ยนคีย์แซนด์บ็อกซ์ที่ใช้สำหรับการพัฒนาและการทดสอบนอกเวอร์ชันที่ใช้งานจริงเท่านั้น ก่อนที่จะทดสอบเวอร์ชันที่ใช้งานจริงและเปิดตัว คุณจะต้องแลกเปลี่ยนคีย์ที่ใช้งานจริงอีกครั้ง