הפרימיטיב 'הצפנה מאומתת עם נתונים משויכים' (AEAD) הוא הפרימיטיב הנפוץ ביותר להצפנת נתונים, והוא מתאים לרוב הצרכים.
ל-AEAD יש את המאפיינים הבאים:
- Secrecy: לא ידוע דבר על הטקסט הרגיל, מלבד האורך שלו.
- אותנטיות: אי אפשר לשנות את הטקסט הלא מוצפן שמהווה את הבסיס למידע המוצפן (ciphertext) בלי שהשינוי יזוהה.
- סימטרי: הצפנת הטקסט הגלוי ופענוח הטקסט המוצפן מתבצעים באמצעות אותו מפתח.
- רנדומיזציה: ההצפנה היא רנדומלית. שתי הודעות עם אותו טקסט לא מוצפן יניבו מידע מוצפן (ciphertext) שונה. תוקפים לא יכולים לדעת איזה מידע מוצפן (ciphertext) מתאים לטקסט לא מוצפן מסוים. כדי למנוע את זה, אפשר להשתמש ב-Deterministic AEAD.
נתונים משויכים
אפשר להשתמש ב-AEAD כדי לקשר פרטים מוצפנים (ciphertext) לנתונים משויכים ספציפיים. נניח שיש לכם מסד נתונים עם השדות user-id ו-encrypted-medical-history. בתרחיש הזה, אפשר להשתמש ב-user-id כנתונים משויכים כשמצפינים את encrypted-medical-history. כך אפשר למנוע מפורץ להעביר היסטוריה רפואית ממשתמש אחד למשתמש אחר.
הנתונים המשויכים הם אופציונליים. אם מציינים נתונים משויכים, הפענוח יצליח רק אם אותם נתונים משויכים יועברו גם לקריאות ההצפנה וגם לקריאות הפענוח.
בחירת סוג המפתח
מומלץ להשתמש ב-AES128_GCM ברוב המקרים, אבל יש סוגים שונים של מפתחות לצרכים שונים. AES128 מציע אבטחה של 128 ביט, ו-AES256 מציע אבטחה של 256 ביט.
שתי מגבלות האבטחה שחשוב לשים לב אליהן כשבוחרים מצב הן:
- QPS: כמה הודעות מוצפנות באמצעות אותו מפתח?
- גודל ההודעה: מה גודל ההודעות?
סוגי המפתחות הנתמכים:
- 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-SIV (AES128_GCM_SIV, AES256_GCM_SIV) מהיר כמעט כמו AES-GCM. יש לו את אותן מגבלות כמו AES-GCM לגבי מספר ההודעות וגודל ההודעה, אבל כשחורגים מהמגבלות האלה, הוא נכשל בצורה פחות קטסטרופלית: יכול להיות שייחשף רק העובדה ששתי הודעות שוות. לכן, השימוש בו בטוח יותר מ-AES-GCM, אבל הוא פחות נפוץ בפועל. כדי להשתמש בו ב-Java, צריך להתקין את Conscrypt.
- לא מתבצעת התחייבות למפתח ADGKLS.
- ל-XChaCha20-Poly1305 (XCHACHA20_POLY1305) יש מגבלה גדולה בהרבה על מספר ההודעות וגודל ההודעה בהשוואה ל-AES-GCM, אבל אם הוא נכשל (מאוד לא סביר), הוא גם חושף חומר מפתח. הוא לא מואץ באמצעות חומרה, ולכן הוא יכול להיות איטי יותר ממצבי AES במצבים שבהם האצת חומרה זמינה.
- לא מתבצעת התחייבות למפתח LGR.
מידע נוסף על פורמט הנתונים של טקסט מוצפן ב-AEAD
התחייבויות אבטחה
הטמעות של AEAD מציעות:
- אבטחת CCA2.
- חוזק אימות של 80 ביט לפחות.
- היכולת להצפין לפחות 232 הודעות עם סך של 250 בייטים. לא נמצאה מתקפה עם עד 232 טקסטים פשוטים או טקסטים מוצפנים שנבחרו, שההסתברות להצלחה שלה גדולה מ-2-32.
תרחישים לדוגמה
אני רוצה להצפין נתונים וגם לקשור טקסט מוצפן להקשר שלו.