הצפנה מאומתת עם נתונים משויכים (AESD)

הפרימיטיב 'הצפנה מאומתת עם נתונים משויכים' (AEAD) הוא הפרימיטיב הנפוץ ביותר להצפנת נתונים, והוא מתאים לרוב הצרכים.

ל-AEAD יש את המאפיינים הבאים:

  • Secrecy: שום דבר לא ידוע על הטקסט הפשוט, חוץ מהאורך שלו.
  • אותנטיות: אי אפשר לשנות את הטקסט הפשוט המוצפן שמתחת למידע המוצפן (ciphertext) בלי שהשינוי יזוהה.
  • סימטרית: הצפנה של הטקסט הגלוי ופענוח של הטקסט המוצפן מתבצעים באמצעות אותו מפתח.
  • אקראיות: ההצפנה היא אקראית. שתי הודעות עם אותו טקסט פשוט מניבות מידע מוצפן שונה. תוקפים לא יכולים לדעת איזה מידע מוצפן (ciphertext) תואם לטקסט נתון ללא הצפנה. כדי למנוע את זה, צריך להשתמש ב-Deterministic AEAD.

נתונים משויכים

אפשר להשתמש ב-AEAD כדי לקשר מידע מוצפן לנתונים משויכים ספציפיים. נניח שיש לכם מסד נתונים עם השדות user-id ו-encrypted-medical-history. בתרחיש הזה, אפשר להשתמש ב-user-id כנתונים משויכים כשמצפינים את encrypted-medical-history. כך אפשר למנוע מתוקפים להעביר היסטוריה רפואית ממשתמש אחד לאחר.

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

בחירת סוג המפתח

אנחנו ממליצים על AES128_GCM לרוב השימושים, אבל יש סוגי מפתחות שונים לצרכים שונים. ‫AES128 מספק אבטחה של 128 ביט, ו-AES256 מספק אבטחה של 256 ביט.

שתי מגבלות האבטחה העיקריות שצריך להביא בחשבון כשבוחרים מצב הן:

  1. QPS: כמה הודעות מוצפנות באמצעות אותו מפתח?
  2. גודל ההודעה: מה הגודל של ההודעות?

סוגי המפתחות הנתמכים:

  • ‫AES-CTR-HMAC‏ (AES128_CTR_HMAC_SHA256, ‏ AES256_CTR_HMAC_SHA256) עם וקטור אתחול (IV) של 16 בייטים הוא המצב השמרני ביותר עם גבולות טובים.
    • התחייבות למפתח.
  • ‫AES-EAX‏ (AES128_EAX, ‏ AES256_EAX) הוא קצת פחות שמרני וקצת יותר מהיר מ-AES128_CTR_HMAC_SHA256.
    • ‫MLGR ללא התחייבות למפתח.
  • בדרך כלל, AES-GCM‏ (AES128_GCM,‏ AES256_GCM) הוא המצב המהיר ביותר, עם המגבלות המחמירות ביותר על מספר ההודעות (232) וגודל ההודעה (כ-64GB לכל הודעה). כשחורגים מהמגבלות האלה, תקן ההצפנה המתקדם AES-GCM נכשל באופן קטסטרופלי, כי הוא חושף טקסט רגיל ואת חלק האימות של המפתח הפנימי של AES-GCM.
    • ‫AES-GCM לא עמיד [ABN] וגם לא מחויב למפתח [GLR]. אפשר ליצור טקסט מוצפן שאפשר לפענח באמצעות שני מפתחות שונים. זה יכול להוביל להתקפות מעשיות [DGRW]. אם המפתח נבחר על ידי היריב, חשוב לבדוק היטב את מידול האיומים.
  • ‫AES-GCM-SIV‏ (AES128_GCM_SIV,‏ AES256_GCM_SIV) [RFC8452] עמיד בפני שימוש שגוי ב-nonce, והביצועים שלו כמעט זהים לאלה של AES-GCM. המגבלות על מספר ההודעות וגודל ההודעות ב-AES-GCM-SIV עם וקטורי אתחול אקראיים גבוהות בהרבה מהמגבלות של AES-GCM. כשחורגים מהמגבלות האלה, הכשל של AES-GCM-SIV פחות חמור: הוא רק מדליף ששתי הודעות זהות. השימוש ב-AES-GCM-SIV בטוח יותר, אבל בפועל הוא פחות נפוץ.
    • גבולות למספרים אקראיים חד-פעמיים:
      • ‫232 הודעות, כאשר כל טקסט פשוט הוא לכל היותר 8GiB
      • ‫248 הודעות, שבהן כל טקסט פשוט הוא בגודל של עד 32MiB
      • ‫264 הודעות, כשכל טקסט לא מוצפן הוא לכל היותר 128KiB
    • כדי להשתמש ב-Java, צריך להתקין את Conscrypt.
    • לא מתבצעת התחייבות למפתח ADGKLS.
  • ל-XChaCha20-Poly1305‏ (XCHACHA20_POLY1305) יש מגבלה גדולה בהרבה על מספר ההודעות וגודל ההודעות מאשר ל-AES-GCM, אבל כשהוא נכשל (סבירות נמוכה מאוד), הוא גם מדליף חומר מפתח. הוא לא מואץ באמצעות חומרה, ולכן הוא יכול להיות איטי יותר ממצבי AES במצבים שבהם יש שיפור מהירות באמצעות חומרה.
    • ‫LGR ללא התחייבות למפתח.

מידע נוסף על פורמט הנתונים של טקסט מוצפן ב-AEAD

התחייבויות בנושא אבטחה

הטמעות של AEAD מציעות:

  • אבטחת CCA2.
  • חוזק אימות של לפחות 80 ביט.
  • היכולת להצפין לפחות 232 הודעות עם סך של 250 בייטים. אין מתקפה עם עד 232 טקסטים פשוטים (plaintext) נבחרים או מידע מוצפן (ciphertext) נבחר עם הסתברות להצלחה שגדולה מ-2-32.

תרחישים לדוגמה

אני רוצה להצפין נתונים ולקשור טקסט מוצפן להקשר שלו.