בפועל, Tink מספק אובייקטים של Key
שמייצגים
מפתחות ו-Parameters
אובייקטים לייצוג Parameters
.
לדוגמה, ב-Java, יש לנו AesGcmKey
אובייקטים
שמייצגים מפתחות AES GCM.
בקטע הזה נסביר איך האובייקטים האלה מעוצבים ב-Java ואיך הם יוצרים אינטראקציה.
Parameters
אובייקטים
כדאי להשתמש ב-AES GCM, סכמת ההצפנה מסוג AEAD שנמצאת בשימוש נרחב.
Tink מספק לאובייקט AesGcmParameters
את המידע הנדרש
ליצור AesGcmKey
, שנסביר מאוחר יותר.
היררכיית הפרמטרים ב-Java נראית כך:
public abstract class Parameters {
public abstract boolean hasIdRequirement();
}
public abstract class AeadParameters extends Parameters {}
public final class AesGcmParameters extends AeadParameters {
/**
* The Variant specified how ciphertexts are [tagged](/tink/design/keysets#tagging_ciphertexts).
*/
public static final class Variant {...}
/** A helper object to create new AesGcmParameters. */
public static final class Builder {...}
public int getKeySizeBytes() {...}
public int getIvSizeBytes() {...}
public int getTagSizeBytes() {...}
public Variant getVariant() {...}
public OutputPrefixType getOutputPrefixType() {...}
public boolean equals(Object object) {...}
public int hashCode() {...}
}
כפי שמוסבר בקטע
Keysets, תיוג מידע מוצפן (ciphertexts),
לחלק מהמפתחות יש דרישה במזהים, כשהם נמצאים בערכת מפתחות. הכול
לאובייקט Parameters
יש שיטה hasIdRequirement
שמציינת אם
למפתח שנוצר על ידי אובייקט Parameters
הזה יהיה מזהה נדרש כזה, או שאין לו מזהה נדרש.
בשלב הבא האובייקט AesGcmParameters
מספק methods getKeySizeBytes()
,
getIvSizeBytes()
ו-getTagSizeBytes()
. מחזירות את האורך של
המפתח שבו נעשה שימוש, אורך ה-IV שבו נעשה שימוש ואורך התג שהופק.
בבייטים. Tink מספק חלק מהפונקציות האלה כדי לשמור על שלמות,
לא תמיד מאפשרת ליצור Aead
לכל אפשרות. לדוגמה, כרגע
רק IV 12 בייט נתמכים עבור AES GCM.
האובייקט AesGcmParameters
גם מספק שינויים מברירת המחדל של ההגדרות הקודמות
methods מוגדרות (ושיטות תקן Java equals
ו-hashCode
שנחשבת כשיטה מומלצת).
לבסוף, הוא מספק שיטות סטטיות ליצירת אובייקטים חדשים AeadParameters
.
הם מאמתים את ערכי הקלט, כלומר מוודאים שהגודל הוא אחד מ-16, 24,
או 32.
אובייקטים מרכזיים
ל-Tink יש גם היררכיית מפתחות. בהמשך לדוגמה שלנו ל-AES GCM, נראה כך:
public abstract class Key {
public abstract Parameters getParameters();
public abstract @Nullable Integer getIdRequirementOrNull();
public abstract boolean equalsKey(Key other);
}
public abstract class AeadKey extends Key {
public abstract AeadParameters getParameters();
public abstract Bytes getOutputPrefix();
}
public final class AesGcmKey implements AeadKey {
public SecretBytes getKeyBytes();
public abstract Bytes getOutputPrefix();
public AesGcmParameters getParameters();
public @Nullable Integer getIdRequirementOrNull();
public boolean equalsKey(Key object);
}
השיטה getIdRequirementOrNull
מחזירה את המזהה שצריך למפתח הזה,
או null
אם אין דרישה.
(למשל, דרישה במפתח נובעת מכך ש-Tink בחלק מהמקרים
תחיליות הצפנה או חתימות באמצעות המחרוזת 0x01<id>
. מידע נוסף מופיע בקטע
בתיוג של מידע מוצפן (ciphertext)).
המדיניות הזו תמיד תהיה תואמת לתוצאה של
getParameters().hasIdRequirement()
ומטמיעים של נכסים חדשים
צריך לוודא את זה.
בהטמעות של Key
צריך גם לספק שיטה equalsKey
כדי
להשוות בין מפתחות שונים. כאלה
שיטה מסוימת שימושית בדרך כלל: לדוגמה, כשבודקים את נגזרת המפתח,
שרוצים להבטיח שיישום חוזר של תפוקת הנגזרת
אותו אובייקט מפתח. בנוסף, יכול להיות ש-KMS ירצה לבדוק אם יש מפתחות שהוא
מספקת למשתמשים שונים שווה ערך (מצב כזה קורה לפעמים אם משתמשים משתפים
מפתחות ולהעלות אותם לאותו KMS כמה פעמים). חשוב לציין
לא לעקוף את שיטת Java equals
, כי הפעולה הזו תחייב אותנו
לעקוף את hashCode
, ואין דרך להטמיע את hashCode
באופן
תואמת ל-equals
מבלי להניח הנחות לא מוכחות.
בשלב הבא, צריך להשתמש ב-method getParameters()
. כך המשתמשים יכולים לקבל
את המידע המקורי על הפרמטרים ששימשו ליצירת המפתח.
לבסוף, ב-AesGcmKey
יש שיטה getKeyBytes
שמחזירה את חומר המפתח הגולמי.
שיטות כאלה אופייניות מאוד למחלקות מפתחות: הן ספציפיות לסוג,
ומתן גישה לחומר המפתח הבסיסי. באמצעות האותות האלה,
באופן כללי, את הפרמיטיבי שמיוצג על ידי המפתח,
או לעשות סריאליזציה של המפתח כדי לאחסן אותו בדיסק או לשלוח אותו
עמוקה מאוד, המפתח עצמו אחראי להגן על חומר המפתח מפני
גישה בלתי מורשית. לדוגמה, הפקודה SecretBytes
דורשת אסימון גישה כדי
לספק את החומר
(למידע נוסף, ראו בקרת גישה).
מקשים אסימטריים
בפרימיטיביים אסימטריים, Tink משתמש בשני מחלקות מפתחות: אחד פרטי והשני למפתחות ציבוריים. לגבי הפרמטרים, עדיף להשתמש (מאחר שיש רק מחלקה אחת שניתן להשתמש בה כדי ליצור את המפתחות).
ב-Tink יש גם ממשק PrivateKey
עם
getPublicKey()
.