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

Standard Payments 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 Binary ในเส้นทางของระบบ คุณจะใช้คำสั่ง POSIX ต่อไปนี้เพื่อสร้างคู่คีย์ใหม่ได้

$ gpg --full-generate-key

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

การกำหนดค่าไลบรารี 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 ที่เข้ารหัสโดยใช้การเข้ารหัสแบบอสมมาตร (คีย์สาธารณะ) ด้วยตัวเลือก "การแปลงค่าแบบกะทัดรัด" โทเค็น 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 ในระหว่างการพัฒนา คุณจะต้องแลกเปลี่ยนคีย์แซนด์บ็อกซ์ที่ใช้สำหรับการพัฒนาและการทดสอบนอกเวอร์ชันที่ใช้งานจริงเท่านั้น ก่อนการทดสอบและเปิดตัวเวอร์ชันที่ใช้งานจริง คุณจะต้องดำเนินการแลกเปลี่ยนคีย์เวอร์ชันที่ใช้งานจริงอีกครั้ง