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

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

הצפנת PGP

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

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

  • הצפנה ופענוח של נתוני payload באמצעות כמה מפתחות 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'igning ו-'C'ertificate generation) וגם מפתח משני (מסומן ב-E, ‏ 'E'ncryption).

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

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

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

  • כשצריך לבצע רוטציה של המפתחות הציבוריים של Google, אפשר להצפין את מטען הייעודי (payload) באמצעות המפתחות הציבוריים הישנים והחדשים של 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 מפתח ציבורי. במהלך הפיתוח, תצטרכו להחליף רק את מפתחות ארגז החול שמשמשים לפיתוח ולבדיקה מחוץ לסביבת הייצור. לפני בדיקות הייצור וההשקה, תצטרכו לבצע עוד החלפה של מפתחות הייצור.