אובייקטים של מפתחות ופרמטרים

בפועל, 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() {...}
}

כפי שמוסבר בקטע ערכות מפתחות, תיוג טקסטים מוצפנים, בחלק מהמפתחות נדרשת דרישה במזהה שלהם, כשהם נכללים בערכת מפתחות. לכל אובייקט Parameters יש שיטה hasIdRequirement שמציינת אם למפתח שנוצר על ידי האובייקט Parameters הזה יהיה מזהה נדרש כזה, או לא.

האובייקט AesGcmParameters בשלב הבא מספק שיטות getKeySizeBytes(), getIvSizeBytes() ו-getTagSizeBytes(). הערך הזה מחזיר את האורך של המפתח שנעשה בו שימוש, את אורך ה-IV בשימוש ואת אורך התג שנוצר בבייטים. ב-Tink מספק חלק מהפונקציות האלה לצורך השלמה, אבל לא תמיד אפשר ליצור פרמטרים Aead לכל אפשרות. לדוגמה, ל-AES GCM יש כרגע תמיכה רק בקובצי IV של 12 בייט.

האובייקט AesGcmParameters כולל גם שינויים בשיטות הקודמות שהוגדרו (ובשיטות הסטנדרטיות של 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 קישר מידע מוצפן (ciphertext) או חתימות באמצעות המחרוזת 0x01<id>, קראו את הקטע בנושא תיוג מידע מוצפן).

זאת תמיד תהיה תואמת לתוצאה של getParameters().hasIdRequirement() וההטמעות של מחלקות מפתח חדשות צריכות לוודא זאת.

בהטמעות של Key צריך גם לספק method equalsKey כדי להשוות בין מפתחות שונים. לעיתים קרובות משתמשים בשיטה הזו: לדוגמה, כשבודקים נגזרות של מפתח, המטרה היא לוודא שהחלה חוזרת של הנגזרת מובילה לאותו אובייקט מפתח. בנוסף, יכול להיות ש-KMS ירצה לבדוק אם המפתחות שהוא מספק למשתמשים שונים הם זהים (מצב כזה קורה לפעמים כשמשתמשים משתפים מפתחות ומעלים אותם לאותו KMS כמה פעמים). יש לציין שאנחנו לא משנים את שיטת Java equals, כי זה ידרוש מאיתנו לבטל את hashCode, ואין דרך להטמיע את hashCode בדרך בטוחה שתואמת ל-equals בלי להניח הנחות לא מוכחות.

בשלב הבא, נדרשת שיטה getParameters(). כך המשתמשים יכולים לקבל את המידע המקורי על הפרמטרים ששימשו ליצירת המפתח.

לבסוף, ל-AesGcmKey יש שיטה getKeyBytes שמחזירה את חומר המפתח הגולמי. שיטות כאלה נפוצות מאוד למחלקות מפתחות: הן ספציפיות לסוג ומספקות גישה לחומר המפתח הבסיסי. באמצעות מפתחות כאלה, המשתמשים יכולים באופן עקרוני: להטמיע את המפתח הראשוני שמיוצג על ידי המפתח או לערוך את המפתח בסדרה, כדי לאחסן אותו בדיסק ולשלוח אותו דרך הרשת. המפתח עצמו אחראי להגנה על חומר המפתח מפני גישה לא מורשית. לדוגמה, הקוד SecretBytes מחייב אסימון גישה כדי לספק בפועל את החומר (מידע נוסף בקטע בקרת גישה).

מפתחות אסימטריים

בפרימיטיבים אסימטריים, ב-Tink משתמש בשני מחלקות מפתחות, אחת למפתחות פרטיים ואחת למפתחות ציבוריים. נוח יותר להשתמש באותה מחלקה (class) ב-Parameters (מחלקה אחת בלבד) כדי ליצור את המפתחות.

ל-Tink יש גם ממשק PrivateKey עם הפונקציה הנוספת getPublicKey().