ב-Tink נעשה שימוש ב-Keysets כדי לאפשר רוטציית מפתחות. באופן רשמי, קבוצת מפתחות היא רשימה1 לא ריקה של מפתחות, שבה מפתח אחד מוגדר כמפתח ראשי (המפתח שמשמש, למשל, לחתימה ולהצפנה של טקסטים ללא הצפנה חדשים). בנוסף, למפתחות בקבוצת מפתחות מוקצה מזהה ייחודי2 וסטטוס מפתח שמאפשר להשבית מפתחות בלי להסיר אותם מקבוצת מפתחות.
קבוצות מפתחות הן הדרך העיקרית שבה משתמשים יכולים לגשת למפתחות (דרך הכיתה KeysetHandle
). כך מובטח שלכל משתמש יש קוד לטיפול בכמה מפתחות בו-זמנית. לרוב המשתמשים בקריפטוגרפיה, טיפול במספר מפתחות הוא חובה: צריך להיות אפשרי לשנות מפתחות (מפתחות ישנים עלולים לדלוף, למשל), וכמעט אף פעם אין 'מעבר למפתח הבא' אטומי שאפשר להחיל על המכונות שבהן הקוד פועל ועל כל הטקסטים המוצפנים, באופן גלובלי ובמהירות. לכן, המשתמש צריך לכתוב קוד שפועל כשעוברים ממקש אחד למקש הבא.
דוגמה: AEAD
נניח שאנחנו משתמשים בקבוצת מפתחות AEAD שמכילה כמה מפתחות לפרימיטיב AEAD. כפי שהוסבר קודם, כל מפתח מציין באופן ייחודי שתי פונקציות: \(\mathrm{Enc}\) ו- \(\mathrm{Dec}\). מעכשיו, קבוצת המפתחות מציינת גם שתי פונקציות חדשות: \(\mathrm{Enc}\) ו- \(\mathrm{Dec}\) - \(\mathrm{Enc}\) שפשוט שווה לפונקציה \(\mathrm{Enc}\) של המפתח הראשי של קבוצת המפתחות, בעוד שהפונקציה \(\mathrm{Dec}\) מנסים לפענח באמצעות כל המפתחות, תוך מעבר עליהם בסדר מסוים (בהמשך מוסבר איך Tink משפרת את הביצועים של הפונקציה הזו).
חשוב לציין שקבוצות מפתחות הן מפתחות מלאים: הן תיאור מלא של הפונקציות \(\mathrm{Enc}\) ושל\(\mathrm{Dec}\) הפונקציות שבהן נעשה שימוש. פירוש הדבר הוא שמשתמשים יכולים לכתוב כיתה שמקבלת כקלט KeysetHandle
, כדי להביע את הרעיון שהכיתה זקוקה לתיאור מלא של אובייקטים \(\mathrm{Enc}\) ו \(\mathrm{Dec}\) כדי לפעול בצורה תקינה. כך המשתמש יכול לכתוב ממשקי API שמציינים: כדי להשתמש בכיתה הזו, צריך לספק לי תיאור של פרימיטיב קריפטוגרפית.
רוטציית מפתחות
נניח שמשתמש ב-Tink כותב תוכנית שמתחילה באחזור קבוצת מפתחות מ-KMS, ואז יוצרת אובייקט AEAD מקבוצת המפתחות הזו, ובסוף משתמשת באובייקט הזה כדי להצפין ולפענח טקסטים מוצפנים.
משתמש כזה מוכן באופן אוטומטי לרוטציית מפתחות, וגם להחלפת אלגוריתמים במקרה שהבחירה הנוכחית שלו כבר לא עומדת בתקן.
עם זאת, צריך להיזהר כשמטמיעים רוטציה כזו של מפתחות: קודם כול, ה-KMS צריך להוסיף מפתח חדש לקבוצת המפתחות (אבל עדיין לא להגדיר אותו כמפתח ראשי). לאחר מכן צריך להשיק את קבוצת המפתחות החדשה לכל הקבצים הבינאריים, כך שכל קובץ בינארי שמשתמש בקבוצת המפתחות הזו יכלול את המפתח החדש ביותר בקבוצת המפתחות. רק אז צריך להגדיר את המפתח החדש כמפתח הראשי, ואת קבוצת המפתחות שנוצרת צריך לחלק שוב לכל הקבצים הבינאריים באמצעות קבוצת המפתחות.
מזהים של מפתחות בטקסטים מוצפנים
נבחן שוב את הדוגמה של קבוצת מפתחות AEAD. אם מבצעים פענוח טקסט מוצפן באופן תמים, Tink צריך לנסות לפענוח באמצעות כל המפתחות שב-Keyset, כי אין דרך לדעת איזה מפתח שימש להצפנת ה-Keyset. הפעולה הזו עלולה לגרום לעומס יתר על הביצועים.
לכן, Tink מאפשר להוסיף לקידומת של מידע מוצפן מחרוזת של 5 בייטים שמקורה במזהה. בהתאם לגישה של 'מפתחות מלאים' שמפורטת למעלה, הקידומת הזו היא חלק מהמפתח, וכל טקסטים מוצפנים שהתקבלו באמצעות המפתח הזה צריכים לכלול את הקידומת הזו. כשמשתמשים יוצרים מפתחות, הם יכולים לבחור אם להשתמש בקידומת כזו במפתח, או להשתמש בפורמט של טקסט מוצפן בלי קידומת.
כשמפתח נמצא בקבוצת מפתחות, מערכת Tink מחשבת את התג הזה מהמזהה של המפתח בקבוצת המפתחות. העובדה שהמזהים ייחודיים2 בתוך קבוצת מפתחות מובילה למסקנה שהתגים ייחודיים. לכן, אם משתמשים רק במפתחות מתויגים, אין ירידה בביצועים בהשוואה לפענוח באמצעות מפתח יחיד: Tink צריך לנסות רק אחד מהמפתחות במהלך הפענוח.
עם זאת, מכיוון שהתג הוא חלק מהמפתח, המשמעות היא גם שהמפתח יכול להיכלל בקבוצת מפתחות רק אם יש לו מזהה ספציפי אחד. לכך יש השלכות מסוימות כשמעיינים בתיאור ההטמעה של אובייקטי מפתח בשפות שונות.
-
בחלקים מסוימים של Tink עדיין מתייחסים למערכי מפתחות כקבוצה. עם זאת, כדאי לשנות את זה. הסיבה לכך היא שהסדר חשוב באופן כללי: לדוגמה, נניח שרוצים לבצע רוטציית מפתחות עם Aead. קודם מתווסף מפתח חדש לקבוצת מפתחות. המפתח הזה עדיין לא הוגדר כמפתח ראשי, אבל הוא פעיל. קבוצת המפתחות החדשה הזו מושקת לכל הקבצים הבינאריים. אחרי שכל הקבצים הבינאריים יכירו את המפתח החדש, הוא יהפוך למפתח הראשי (רק בשלב הזה השימוש במפתח הזה יהיה בטוח). בשלב השני הזה, סיבוב המפתחות צריך לדעת מהו המפתח האחרון שנוסף. ↩
-
כדי לאפשר תאימות לספרייה פנימית של Google, ב-Tink אפשר ליצור קבוצות מפתחות שבהן מזהים חוזרים על עצמם. התמיכה הזו תוסר בעתיד. ↩