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

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

הצפנת PGP

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

כשמשתמשים ב-PGP להצפנת עומסי נתונים, השותפים צריכים לתמוך באפשרויות הבאות:

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

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

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

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

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

$ gpg --full-generate-key

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

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

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

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

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

  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, השותפים צריכים לתמוך באפשרויות הבאות:

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

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