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

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

הצפנת PGP

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

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

  • הצפנה ופענוח של נתוני 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

שליחת מטענים ייעודיים (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, משתתפים בתוכנית חייבים לתמוך באפשרויות הבאות:

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