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

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

การเข้ารหัส PGP

PGP คือชุดอัลกอริทึมการเข้ารหัส การถอดรหัส และการลงนามแบบมาตรฐาน ซึ่งให้ความเป็นส่วนตัวและการตรวจสอบสิทธิ์ด้านการเข้ารหัสลับ

เมื่อใช้ PGP เพื่อเข้ารหัสเพย์โหลด พาร์ทเนอร์ต้องรองรับสิ่งต่อไปนี้

  • การเข้ารหัสและถอดรหัสเพย์โหลดด้วยคีย์ PGP หลายรายการ
  • การลงนามเพย์โหลดด้วยคีย์ PGP หลายรายการ
  • การตรวจสอบเพย์โหลดด้วยลายเซ็นหลายรายการ ซึ่งลายเซ็นใดลายเซ็นหนึ่งอาจเป็นลายเซ็นที่มีคีย์ที่ Google ให้มา
  • การถอดรหัสเพย์โหลดที่เข้ารหัส Web-safe base64

คีย์สาธารณะ PGP ที่มอบให้ Google ต้องมีคีย์ย่อยที่ใช้สำหรับการเข้ารหัส คีย์ย่อยอนุญาตให้หมุนเวียนคีย์แยกจากคีย์หลักได้ คีย์หลักใช้สำหรับการยืนยันตัวตน คีย์ส่วนตัวต้องเป็นคีย์ RSA ขนาด 2048 บิต (หรือมากกว่า) ที่หมดอายุภายใน 1 ปี และมีอายุการใช้งานสูงสุด 2 ปี

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

การสร้างคีย์ PGP ใหม่

สมมติว่าคุณมี ไบนารี GPG ในเส้นทางระบบ คุณ สามารถใช้คำสั่ง POSIX ต่อไปนี้เพื่อสร้างคู่คีย์ใหม่

$ gpg --full-generate-key

เมื่อได้รับข้อความแจ้ง ให้เลือกคีย์ RSA ที่มีเอนโทรปีอย่างน้อย 2048 บิตและหมดอายุภายใน 1-2 ปี คำสั่งนี้ควรสร้างทั้งคีย์หลัก (ติดป้ายกำกับ SC สำหรับ "S"igning และ "C"ertificate generation) และคีย์ย่อย (ติดป้ายกำกับ E สำหรับ "E"ncryption)

การหมุนเวียนคีย์

ระบบรองรับคีย์ PGP ที่ใช้งานอยู่หลายรายการสำหรับทั้งพาร์ทเนอร์และ Google เพื่อให้มั่นใจว่าบริการจะไม่หยุดชะงักในระหว่างการหมุนเวียนคีย์

  • คุณสามารถลงนามเพย์โหลดด้วยคีย์เก่าและคีย์ใหม่ได้ในระหว่างการหมุนเวียนคีย์ Google จะตรวจสอบลายเซ็นกับ คีย์สาธารณะที่ใช้งานอยู่ทั้งหมดที่ Google มีในไฟล์

  • เมื่อต้องการหมุนเวียนคีย์สาธารณะของ Google คุณสามารถเข้ารหัสเพย์โหลดด้วยคีย์สาธารณะของ Google ทั้งเก่าและใหม่ Google สามารถถอดรหัสด้วยคีย์ใดก็ได้

  • รหัสคีย์ PGP ภายในข้อความเองจะช่วยให้ระบุคีย์ได้โดยอัตโนมัติ จึงไม่จำเป็นต้องใช้ฟิลด์เวอร์ชันเพย์โหลดหรือเวลาเปลี่ยนผ่านที่ประสานงานกัน ระบบจะจัดการคีย์โดยใช้คอนโซลผู้ออกบัตร

การกำหนดค่าไลบรารี 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 พาร์ทเนอร์ต้องรองรับตัวเลือกต่อไปนี้

  • Compact Serialization
  • การถอดรหัสเพย์โหลดจากคีย์ JWE หลายรายการ
  • อัลกอริทึม RSA-OAEP, RSA-OAEP-256 หรือ ECDH-ES สำหรับการจัดการคีย์
  • อัลกอริทึม A256GCM, A128GCM, A128CBC-HS256 หรือ A256CBC-HS512 สำหรับการเข้ารหัสเนื้อหา
    • ป้อนข้อมูลในส่วนหัว enc
  • ส่วนหัว kid เพื่อระบุคีย์การเข้ารหัสสาธารณะ
  • เพย์โหลดข้อความที่ใช้การเข้ารหัส JWE ต้องใช้ประเภทเนื้อหา application/jose; charset=utf-8

เมื่อใช้ JWS พาร์ทเนอร์ต้องรองรับตัวเลือกต่อไปนี้

  • Compact Serialization
  • การตรวจสอบเพย์โหลดจากคีย์ 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 ในระหว่างการพัฒนา คุณจะต้องแลกเปลี่ยนคีย์ Sandbox ที่ใช้สำหรับการพัฒนาและการทดสอบภายนอกเวอร์ชันที่ใช้งานจริงเท่านั้น ก่อนการทดสอบเวอร์ชันที่ใช้งานจริงและการเปิดตัว คุณจะต้องแลกเปลี่ยนคีย์เวอร์ชันที่ใช้งานจริงอีกครั้ง