من الناحية العملية، توفّر 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()
.