הפרימיטיב 'הצפנה מאומתת עם נתונים משויכים' (AEAD) הוא הפרימיטיב הנפוץ ביותר להצפנת נתונים, והוא מתאים לרוב הצרכים.
ל-AEAD יש את המאפיינים הבאים:
- Secrecy: לא ידוע דבר על הטקסט הרגיל, מלבד האורך שלו.
- אותנטיות: אי אפשר לשנות את הטקסט הרגיל המוצפן שמהווה את הבסיס לטקסט המוצפן בלי שהשינוי יתגלה.
- סימטרי: הצפנת הטקסט הגלוי ופענוח הטקסט המוצפן מתבצעים באמצעות אותו מפתח.
- רנדומיזציה: ההצפנה היא אקראית. שתי הודעות עם אותו טקסט רגיל יניבו טקסטים מוצפנים שונים. תוקפים לא יכולים לדעת איזה טקסט מוצפן מתאים לטקסט גלוי מסוים. כדי למנוע את זה, אפשר להשתמש ב-Deterministic AEAD במקום זאת.
נתונים משויכים
אפשר להשתמש ב-AEAD כדי לקשור טקסט מוצפן לנתונים משויכים ספציפיים. נניח שיש לכם מסד נתונים עם השדות user-id
ו-encrypted-medical-history. בתרחיש הזה, אפשר להשתמש ב-user-id כנתונים משויכים כשמצפינים את encrypted-medical-history. כך לא תהיה אפשרות לתוקף להעביר היסטוריה רפואית ממשתמש אחד למשתמש אחר.
הוספת נתונים משויכים היא אופציונלית. אם מציינים נתונים משויכים, הפענוח יצליח רק אם אותם נתונים משויכים יועברו גם לקריאות ההצפנה וגם לקריאות הפענוח.
בחירת סוג המפתח
אנחנו ממליצים על AES128_GCM לרוב השימושים, אבל יש סוגים שונים של מפתחות לצרכים שונים (לשימוש באבטחה של 256 ביט, צריך להחליף את AES128 ב-AES256). באופן כללי:
- AES128_CTR_HMAC_SHA256 עם וקטור אתחול (IV) של 16 בייט הוא המצב הכי שמרני עם גבולות טובים.
- AES128_EAX קצת פחות שמרני וקצת יותר מהיר מ-AES128_CTR_HMAC_SHA256.
- בדרך כלל, AES128_GCM הוא המצב הכי מהיר, עם המגבלות הכי מחמירות על מספר ההודעות וגודל ההודעה. אם חורגים מהמגבלות האלה על אורך הטקסט הגלוי ועל אורך הנתונים המשויכים (למטה), ההצפנה מסוג AES128_GCM נכשלת ומתרחשת דליפה של חומר מפתח.
- AES128_GCM_SIV מהיר כמעט כמו AES128_GCM. יש לה אותן מגבלות כמו ל-AES128_GCM לגבי מספר ההודעות וגודל ההודעה, אבל אם חורגים מהמגבלות האלה, היא נכשלת בצורה פחות קטסטרופלית: היא עשויה רק לחשוף את העובדה ששתי הודעות שוות. השימוש בו בטוח יותר מ-AES128_GCM, אבל בפועל משתמשים בו פחות. כדי להשתמש בזה ב-Java, צריך להתקין את Conscrypt.
- ל-XChaCha20Poly1305 יש מגבלה גבוהה בהרבה על מספר ההודעות ועל גודל ההודעה בהשוואה ל-AES128_GCM, אבל כשהוא נכשל (מאוד לא סביר), הוא גם חושף חומר מפתח. הוא לא מואץ באמצעות חומרה, ולכן הוא יכול להיות איטי יותר ממצבי AES במצבים שבהם האצת חומרה זמינה.
התחייבויות אבטחה
הטמעות של AEAD מציעות:
- אבטחת CCA2.
- חוזק אימות של 80 ביט לפחות.
- היכולת להצפין לפחות 232 הודעות עם סך של 250 בייטים. לא ניתן לבצע מתקפה עם עד 232 טקסטים פשוטים או טקסטים מוצפנים שנבחרו, עם הסתברות להצלחה שגבוהה מ-2-32.
תרחישים לדוגמה
אני רוצה להצפין נתונים וגם לקשור טקסט מוצפן להקשר שלו.