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

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