كائنات المفاتيح والمعلمات

من الناحية العملية، توفّر Tink Key عنصرًا لتمثيلها. المفاتيح والكائنات Parameters لتمثيل Parameters. على سبيل المثال، في Java، لدينا AesGcmKey كائنات تمثل مفاتيح GCM لمعيار AES.

في هذا القسم، نوضح كيفية تصميم هذه الكائنات في 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 لكل خيار. على سبيل المثال، حاليًا تتوافق فقط 12 بايت IV مع بروتوكول AES GCM.

يوفّر الكائن 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 في بعض الحالات بادئات النصوص المُشفَّرة أو التوقيعات بالسلسلة 0x01<id>، يُرجى الاطّلاع على القسم وضع علامات النص المُشفر).

سيكون هذا دائمًا متسقًا مع نتيجة getParameters().hasIdRequirement() والقائمون على تنفيذ العناصر الجديدة والفئات الرئيسية لضمان ذلك.

تتطلب عمليات تنفيذ Key أيضًا توفير طريقة equalsKey ومقارنة مفاتيح مختلفة. مثل طريقة ما تكون مفيدة: على سبيل المثال عند اختبار اشتقاق المفتاح، فإن إحداهما مهتمة بضمان أن التطبيق المتكرر للمشتق ينتج عنه نفس الكائن الرئيسي. أيضًا، قد ترغب KMS في التحقق مما إذا كان أي من المفاتيح التي تقدمها للمستخدمين المختلفين (وهو ما يحدث أحيانًا إذا شارك المستخدمون وقم بتحميلها على نفس KMS عدة مرات). من الجدير بالذكر أننا عدم تجاوز طريقة Java equals، لأنّ ذلك سيتطلب منا ولا يمكن إلغاء hashCode، ولا توجد طريقة لتنفيذ hashCode في بيئة آمنة متوافقة مع equals بدون وضع افتراضات غير مثبَتة.

بعد ذلك، نحتاج إلى طريقة getParameters(). وهذا يتيح للمستخدمين الحصول على المعلومات الأصلية عن المعلمات المستخدمة لإنشاء المفتاح.

أخيرًا، تستخدم AesGcmKey طريقة getKeyBytes تعرض المادة الأساسية الأولية. هذه الطرق شائعة جدًا مع الفئات الرئيسية: فهي خاصة بالنوع، وتوفير إمكانية الوصول إلى المواد الرئيسية الأساسية باستخدام هؤلاء، المستخدمون من حيث المبدأ، مثلاً وتنفيذ العنصر الأساسي الذي يمثله المفتاح، أو إنشاء تسلسل للمفتاح لتخزينه على قرص أو إرساله عبر الشبكة. المفتاح نفسه مسؤول عن حماية المواد الرئيسية من الوصول غير المصرح به. على سبيل المثال، تتطلب السمة SecretBytes رمز دخول من أجل في الواقع تقديم المواد (يُرجى الاطّلاع على التحكم في الوصول).

المفاتيح غير المتماثلة

بالنسبة إلى الأساسيات غير المتماثلة، يستخدم Tink فئتين رئيسيتين، واحدة للخاصة والأخرى للمفاتيح العامة. بالنسبة إلى المعلمات، يكون من الأكثر ملاءمة استخدام نفس class (حيث توجد فئة واحدة فقط يمكن استخدامها لإنشاء المفاتيح).

يضم Tink أيضًا واجهة PrivateKey مع الدالة getPublicKey().