מושגים בהצפנת AEAD

‫GoogleSQL for BigQuery תומך בהצפנה מאומתת עם נתונים משויכים (AEAD).

במאמר הזה מוסבר על מושגי ההצפנה של AEAD ב-GoogleSQL. לתיאור של פונקציות ההצפנה השונות של AEAD שנתמכות ב-GoogleSQL, אפשר לעיין במאמר בנושא פונקציות הצפנה של AEAD.

המטרה של הצפנת AEAD

ב-BigQuery הנתונים מאובטחים באמצעות הצפנה במנוחה. ב-BigQuery יש גם תמיכה במפתחות הצפנה בניהול הלקוח (CMEK), שמאפשרים להצפין טבלאות באמצעות מפתחות הצפנה ספציפיים. עם זאת, במקרים מסוימים יכול להיות שתרצו להצפין ערכים ספציפיים בטבלה.

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

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

ערכות מפתחות

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

הייצוג של קבוצת מפתחות ב-GoogleSQL הוא כמאגר אחסון לפרוטוקולים מסוג google.crypto.tink.Keyset ב-BYTES שעבר סריאליזציה.

דוגמה

הדוגמה הבאה היא של קבוצת מפתחות AEAD, שמוצגת כמחרוזת JSON, עם שלושה מפתחות.

{
  "primaryKeyId": 569259624,
  "key": [
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiDPhTp5gIhfnDb6jfKOT4SmNoriIJc7ah8uRvrCpdNihA==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "ENABLED",
      "keyId": 569259624,
      "outputPrefixType": "TINK"
    },
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiBp6aU2cFbVfTh9dTQ1F0fqM+sGHXc56RDPryjAnzTe2A==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "DISABLED",
      "keyId": 852264701,
      "outputPrefixType": "TINK"
    },
    {
      "status": "DESTROYED",
      "keyId": 237910588,
      "outputPrefixType": "TINK"
    }
  ]
}

בדוגמה שלמעלה, למפתח קריפטוגרפי הראשי יש מזהה של 569259624 והוא המפתח הראשון שמופיע במחרוזת ה-JSON. יש שני מפתחות קריפטוגרפיים משניים, אחד עם המזהה 852264701 במצב מושבת, ואחד עם המזהה 237910588 במצב השמדה. כשפונקציית הצפנה של AEAD משתמשת בערכת המפתחות הזו להצפנה, הטקסט המוצפן שמתקבל מקודד את מזהה המפתח הקריפטוגרפי הראשי של 569259624.

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

סוג המפתח קובע את מצב ההצפנה שבו יש להשתמש עם המפתח הזה.

הצפנה של טקסט לא מוצפן יותר מפעם אחת באמצעות אותו סט מפתחות בדרך כלל מחזירה ערכים שונים של מידע מוצפן (ciphertext) בגלל וקטורים שונים של אתחול (IV), שנבחרים באמצעות מחולל המספרים הפסאודו-אקראיים שסופק על ידי OpenSSL.

ערכות מקשים עטופות

אם אתם צריכים לנהל בצורה מאובטחת קבוצת מפתחות או להעביר אותה בערוץ לא מהימן, כדאי להשתמש בקבוצת מפתחות עטופה. כשעוטפים קבוצת מפתחות גולמית, התהליך הזה מצפין את קבוצת המפתחות הגולמית באמצעות מפתח Cloud KMS.

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

בדומה לערכות מפתחות, אפשר ומומלץ לבצע רוטציה של ערכות מפתחות עטופות באופן תקופתי. קבוצות מפתחות ארוזות משמשות בפונקציות הצפנת מעטפת של AEAD.

הנה כמה דוגמאות לפונקציות עם קבוצות מפתחות מוצפנות:

תקן Advanced Encryption Standard‏ (AES)

פונקציות הצפנה של AEAD משתמשות בהצפנה בתקן Advanced Encryption Standard‏ (AES). הצפנת AES מקבלת טקסט לא מוצפן כקלט, יחד עם מפתח קריפטוגרפי, ומחזירה רצף מוצפן של בייטים כפלט. אפשר לפענח את רצף הבייטים הזה מאוחר יותר באמצעות אותו מפתח ששימש להצפנה. ב-AES משתמשים בגודל בלוק של 16 בייט, כלומר הטקסט ללא הצפנה מטופל כרצף של בלוקים בגודל 16 בייט. המידע המוצפן יכיל קידומת ספציפית ל-Tink שמציינת את המפתח ששימש לביצוע ההצפנה. הצפנת AES תומכת בכמה מצבים של צופן בלוקים.

מצבים של צופן בלוקים

שני מצבי הצפנה בבלוקים שנתמכים על ידי פונקציות הצפנה של AEAD הם GCM ו-CBC.

GCM

Galois/Counter Mode (GCM)‎ הוא מצב להצפנת AES. הפונקציה ממספרת את הבלוקים ברצף, ואז משלבת את מספר הבלוק עם וקטור אתחול (IV). וקטור אתחול הוא ערך אקראי או פסאודו-אקראי שמהווה את הבסיס לאקראיות של נתוני הטקסט הגלוי. לאחר מכן, הפונקציה מצפינה את מספר הבלוק המשולב ואת ה-IV באמצעות AES. הפונקציה מבצעת פעולת XOR לוגית ברמת הסיביות על תוצאת ההצפנה ועל הטקסט לא מוצפן כדי ליצור את מידע מוצפן (ciphertext). מצב GCM משתמש במפתח קריפטוגרפי באורך של 128 או 256 ביט.

מצב CBC

ב-CBC, הבלוקים 'מקושרים' על ידי ביצוע XOR לכל בלוק של טקסט רגיל עם הבלוק הקודם של טקסט מוצפן לפני ההצפנה. מצב CBC משתמש במפתח קריפטוגרפי באורך של 128, 192 או 256 ביט. ב-CBC נעשה שימוש בווקטור אתחול של 16 בייט בתור הבלוק ההתחלתי, והבלוק הזה עובר פעולת XOR עם הבלוק הראשון של הטקסט הרגיל.

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

נתונים נוספים

פונקציות ההצפנה של AEAD תומכות בשימוש בארגומנט additional_data, שנקרא גם נתונים משויכים (AD) או נתונים מאומתים נוספים. אפשר לפענח טקסט מוצפן רק אם מספקים גם את אותם נתונים נוספים ששימשו להצפנה. לכן אפשר להשתמש בנתונים הנוספים כדי לקשור את הטקסט המוצפן להקשר.

לדוגמה, additional_data יכול להיות הפלט של CAST(customer_id AS STRING) כשמצפינים נתונים של לקוח מסוים. כך מוודאים שכשהנתונים מפוענחים, הם הוצפנו קודם לכן באמצעות customer_id הצפוי. נדרש אותו ערך additional_data לצורך פענוח. מידע נוסף זמין ב-RFC 5116.

פענוח

הפלט של AEAD.ENCRYPT הוא טקסט מוצפן BYTES. הפונקציות AEAD.DECRYPT_STRING או AEAD.DECRYPT_BYTES יכולות לפענח את הטקסט המוצפן הזה. הפונקציות האלה צריכות להשתמש בקבוצת מפתחות שמכילה את המפתח ששימש להצפנה. המפתח הזה צריך להיות במצב 'ENABLED'. בנוסף, הם צריכים להשתמש באותו additional_data שבו נעשה שימוש בהצפנה.

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

הפלט של AEAD.DECRYPT_STRING הוא מחרוזת טקסט פשוטה, והפלט של AEAD.DECRYPT_BYTES הוא טקסט פשוט BYTES. ‫AEAD.DECRYPT_STRING יכול לפענח טקסט מוצפן שמקודד ערך STRING.‫AEAD.DECRYPT_BYTES יכול לפענח טקסט מוצפן שמקודד ערך BYTES. שימוש באחת מהפונקציות האלה כדי לפענח טקסט מוצפן שמקודד סוג נתונים שגוי, למשל שימוש בפונקציה AEAD.DECRYPT_STRING כדי לפענח טקסט מוצפן שמקודד ערך BYTES, גורם להתנהגות לא מוגדרת ועשוי להוביל לשגיאה.

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

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

רוטציה של קבוצת מפתחות כוללת:

  1. יצירת מפתח קריפטוגרפי ראשי חדש בכל קבוצת מפתחות.
  2. פענוח והצפנה מחדש של כל הנתונים המוצפנים.

הפונקציה KEYS.ROTATE_KEYSET או KEYS.ROTATE_WRAPPED_KEYSET מבצעת את השלב הראשון, על ידי הוספה של מפתח קריפטוגרפי ראשי חדש לערכת מפתחות ושינוי המפתח הקריפטוגרפי הראשי הישן למפתח קריפטוגרפי משני.

מפתחות Cloud KMS

‫GoogleSQL תומכת בפונקציות הצפנה של AEAD עם מפתחות Cloud KMS כדי לאבטח את הנתונים שלכם בצורה טובה יותר. שכבת ההגנה הנוספת הזו מצפינה את המפתח להצפנת נתונים (DEK) באמצעות מפתח להצפנת מפתחות הצפנה (KEK). המפתח להצפנת מפתחות הוא קבוצת מפתחות הצפנה סימטריים שמאוחסנת בצורה מאובטחת ב-Cloud Key Management Service ומנוהלת באמצעות הרשאות ותפקידים ב-Cloud KMS.

בזמן ההפעלה של השאילתה, משתמשים בפונקציה KEYS.KEYSET_CHAIN כדי לספק את נתיב משאב ה-KMS של ה-KEK ואת הטקסט המוצפן מ-DEK שעבר אריזה. ‫BigQuery קורא ל-Cloud KMS כדי לבטל את העטיפה של ה-DEK, ואז משתמש במפתח הזה כדי לפענח את הנתונים בשאילתה. הגרסה הלא ארוזה של ה-DEK מאוחסנת בזיכרון רק למשך השאילתה, ואז היא מושמדת.

מידע נוסף זמין במאמר בנושא הצפנה ברמת העמודה ב-SQL באמצעות מפתחות Cloud KMS.