הצפנה של שכבת האפליקציה

ממשקי API רגילים של Payments תומכים בהצפנה של שכבת האפליקציה באמצעות PGP או JWE.

הצפנת PGP

‫PGP הוא קבוצה סטנדרטית של אלגוריתמים להצפנה, לפענוח ולחתימה, שמספקים פרטיות קריפטוגרפית ואימות.

כשמשתמשים ב-PGP כדי להצפין נתוני תשלום, השותפים צריכים לתמוך ב:

  • הצפנה ופענוח של מטענים ייעודיים (payloads) באמצעות כמה מפתחות PGP.
  • חתימה על מטען ייעודי (payload) באמצעות כמה מפתחות PGP.
  • אימות מטען ייעודי (payload) עם כמה חתימות, שאחת מהן יכולה להיות החתימה עם המפתח שסופק על ידי Google.
  • פענוח של מטען ייעודי (payload) בקידוד Base64 שבטוח לשימוש באינטרנט.

למפתחות ציבוריים של PGP שמועברים ל-Google צריך להיות מפתח משני שמשמש להצפנה. המפתח המשני מאפשר רוטציה עצמאית מהמפתח הראשי. המפתח הראשי משמש לאימות זהות. מפתחות פרטיים צריכים להיות מפתחות RSA של 2,048 ביט (או יותר) שתוקפם פג אחרי שנה ומשך החיים המקסימלי שלהם הוא שנתיים.

לפני שמתחילים בפיתוח, צריך להחליף מפתחות PGP עם Google. בשלב הזה, יוצרים זוג מפתחות PGP ציבורי/פרטי, מספקים את המפתח הציבורי ל-Google ומקבלים מ-Google מפתח ציבורי. במהלך הפיתוח, תצטרכו להחליף רק את מפתחות ארגז החול שמשמשים לפיתוח ולבדיקה מחוץ לסביבת הייצור. לפני בדיקות הייצור וההשקה, תצטרכו לבצע החלפה נוספת של מפתחות הייצור.

יצירת מפתח PGP חדש

בהנחה שיש לכם קובץ בינארי של GPG בנתיב המערכת, אתם יכולים להשתמש בפקודת POSIX הבאה כדי ליצור זוג מפתחות חדש.

$ gpg --full-generate-key

כשמוצגת בקשה, בוחרים מפתח RSA עם אנטרופיה של לפחות 2048 ביט ותאריך תפוגה של שנה עד שנתיים. הפקודה הזו אמורה ליצור גם מפתח ראשי (מסומן ב-SC, ‏ 'S' בשביל חתימה ו-'C' בשביל יצירת אישור) וגם מפתח משני (מסומן ב-E, ‏ 'E' בשביל הצפנה).

רוטציית מפתחות

כדי להבטיח שירות ללא הפרעות במהלך החלפת מפתחות, המערכת תומכת בכמה מפתחות PGP פעילים גם לשותפים וגם ל-Google.

  • אתם יכולים לחתום על מטען ייעודי (payload) באמצעות מפתחות ישנים וחדשים במהלך הרוטציה שלהם. ‫Google תאמת את החתימה מולכל מפתח ציבורי פעיל ש-Google שמרה.

  • כשצריך לבצע רוטציה של המפתחות הציבוריים של Google, אפשר להצפין את נתוני התשלום באמצעות המפתחות הציבוריים הישנים והחדשים של Google. ‏ Google יכולה לפענח את הנתונים באמצעות כל אחד מהמפתחות.

  • מזהי מפתחות PGP בהודעה עצמה מאפשרים זיהוי אוטומטי של המפתחות, ולכן אין צורך בשדות גרסת מטען ייעודי או בזמני מעבר מתואמים.

הגדרת ספריית PGP

שליחת מטענים ייעודיים (payloads)

  1. כשחותמים, צריך להשתמש ב-SHA384 כאלגוריתם הגיבוב. לא להשתמש ב-SHA1 או ב-MD5.
  2. כשמצפינים, צריך להשתמש ב-AES256 כאלגוריתם ההצפנה הסימטרי, ולא ב-CAST5 או ב-IDEA.
  3. כשמצפינים או חותמים על הודעות, חשוב לבחור את מפתח המשנה עם המטרה המתאימה. משתמשים במפתח CAN_SIGN לחתימה ובמפתח ENCRYPT_COMMS/ENCRYPT_STORAGE להצפנה.

קבלת מטענים ייעודיים (payloads)

  1. כשמאמתים מטען ייעודי (payload), חשוב לוודא שהספרייה תומכת באלגוריתמים מודרניים של גיבוב (hashing) כמו SHA384. ‫Google תתחיל להשתמש בו בכל המפתחות החדשים החל מ-14 במאי 2023.
  2. כשמפענחים מטען ייעודי (payload), צריך לוודא שהספרייה תומכת באלגוריתמים מודרניים של הצפנה סימטרית כמו AES256. Google תתחיל להשתמש באלגוריתם הזה בכל המפתחות החדשים החל מ-14 במאי 2023.

דוגמה להצפנת מטען ייעודי (payload) באמצעות 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‏ (JWS) היא תקן שמוגדר על ידי rfc7515 לחתימת תוכן ברמת האפליקציה.

הבקשות והתשובות יהיו טוקנים של JWE שמוצפנים באמצעות הצפנה אסימטרית (מפתח ציבורי) עם האפשרות Compact Serialization (סדרת נתונים דחוסה). אסימון ה-JWE יכיל את המטען הייעודי החתום כאסימון JWS. ב-JWS נעשה שימוש גם במפתחות אסימטריים: מפתח פרטי לחתימה ומפתח ציבורי לאימות.

כששולחים מטען ייעודי (payload), קודם חותמים עליו ואז מצפינים אותו. כשמקבלים מטען ייעודי (payload), קודם מפענחים אותו ואז מאמתים את החתימה.

כשמשתמשים ב-JWE, השותפים צריכים לתמוך באפשרויות הבאות:

  • Compact Serialization.
  • פענוח של מטען ייעודי (payload) מאחד מכמה מפתחות JWE.
  • אלגוריתם RSA-OAEP,‏ RSA-OAEP-256 או ECDH-ES לניהול מפתחות.
  • האלגוריתם A256GCM, A128GCM, A128CBC-HS256 או A256CBC-HS512 להצפנת תוכן.
    • מאוכלס בכותרת enc.
  • כותרת kid כדי לזהות את מפתח ההצפנה הציבורי.
  • מטענים ייעודיים (payloads) של הודעות שמוצפנים באמצעות JWE חייבים להשתמש בסוג התוכן application/jose; charset=utf-8.

כשמשתמשים ב-JWS, משתתפים בתוכנית Partners חייבים לתמוך באפשרויות הבאות:

  • Compact Serialization.
  • אימות מטענים ייעודיים (payloads) מאחד מכמה מפתחות JWS.
  • האלגוריתם HS256,‏ HS384,‏ HS512,‏ RS256,‏ RS384,‏ RS512,‏ ES256,‏ PS256,‏ PS384 או PS512 ליצירת חתימה.
  • כותרת kid כדי לזהות את מפתח החתימה הפרטי.

מחרוזות JWE/JWS יקודדו כמחרוזות UTF-8, והמטען הייעודי שלהן יכול להיות בבייטים שרירותיים.

מפתחות פרטיים צריכים להיות מפתחות RSA/ECDH-ES שתוקפם פג אחרי שנה, עם משך חיים מקסימלי של שנתיים. כל הזהויות של המפתחות הפרטיים צריכות תמיד להישאר בשרת של השותף, ולכן כל ערכי החתימה צריכים להיות מחושבים בשרת של השותף.

לפני שמתחילים בפיתוח, צריך להחליף מפתחות JWE ו-JWS עם Google. המפתחות צריכים להיות בפורמט JWK, כפי שמוגדר ב-rfc7517. בשלב הזה, יוצרים זוג מפתחות ציבורי/פרטי, מספקים את המפתח הציבורי ל-Google ומקבלים מ-Google מפתח ציבורי. במהלך הפיתוח, תצטרכו להחליף רק את מפתחות ארגז החול שמשמשים לפיתוח ולבדיקה מחוץ לסביבת הייצור. לפני בדיקות הייצור וההשקה, תצטרכו לבצע החלפה נוספת של מפתחות הייצור.