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

‫GoogleSQL ל-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 למצב מופעל יאפשר להשתמש בו לפענוח.

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

הצפנה של טקסט לא מוצפן יותר מפעם אחת באמצעות אותו סט מפתחות בדרך כלל מחזירה ערכים שונים של טקסט מוצפן, בגלל וקטורי אתחול (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 לכל בלוק של טקסט לא מוצפן עם הבלוק הקודם של מידע מוצפן (ciphertext) לפני ההצפנה. מצב CBC משתמש במפתח קריפטוגרפי באורך של 128, 192 או 256 ביט. ב-CBC נעשה שימוש בווקטור אתחול (IV) של 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 מבצעת את השלב הראשון, על ידי הוספה של מפתח קריפטוגרפי ראשי חדש ל-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.