ব্যবহারিক ক্ষেত্রে, Tink Key অবজেক্ট প্রদান করে যা
কী এবং Parameters অবজেক্টকে Parameters হিসেবে দেখায়।
যেমন, Java-তে AES GCM কী দেখানোর জন্য আমাদের কাছে AesGcmKeyটি অবজেক্ট আছে।
এই বিভাগে, আমরা ব্যাখ্যা করি যে কীভাবে এই অবজেক্টগুলি 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 boolean equals(Object object) {...}
public int hashCode() {...}
}
কীসেট, সাইফারটেক্সট ট্যাগ করা
বিভাগে যেমন ব্যাখ্যা করা হয়েছে,
কিছু কী যখন কীসেটে থাকে, তখন তাদের আইডির জন্য কিছু প্রয়োজনীয়তা থাকে। প্রতিটি
Parameters অবজেক্টের একটি পদ্ধতি hasIdRequirement আছে যা নির্দিষ্ট করে যে এই Parameters অবজেক্টের দ্বারা তৈরি করা
কী-এর এমন একটি প্রয়োজনীয় আইডি থাকবে কিনা।
AesGcmParameters অবজেক্টটি getKeySizeBytes(),
getIvSizeBytes() এবং getTagSizeBytes() মেথড প্রদান করে। এগুলি ব্যবহৃত কী-এর দৈর্ঘ্য,
ব্যবহৃত IV-এর দৈর্ঘ্য এবং তৈরি করা ট্যাগের দৈর্ঘ্য
বাইট হিসেবে দেখায়। Tink সম্পূর্ণতার জন্য এইসব ফাংশনের কিছু প্রদান করলেও, এটি
সবসময় প্রতিটি পছন্দের জন্য Aead তৈরি করার অনুমতি দেয় না। যেমন, বর্তমানে
AES GCM-এর জন্য শুধুমাত্র ১২ বাইট IV কাজ করে।
AesGcmParameters অবজেক্টটি আগে থেকে সংজ্ঞায়িত পদ্ধতির জন্য ওভাররাইডও প্রদান করে (এবং জাভা স্ট্যান্ডার্ড পদ্ধতি equals এবং hashCode যা ভাল অনুশীলন হিসাবে বিবেচিত হয়)।
সবশেষে, এটি নতুন AeadParameters অবজেক্ট তৈরি করার জন্য স্ট্যাটিক পদ্ধতি প্রদান করে।
এগুলি ইনপুট যাচাই করে, অর্থাৎ, এগুলি চেক করে যে সাইজ ১৬, ২৪ বা ৩২-এর মধ্যে
কোনও একটি কিনা।
মূল অবজেক্ট
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 extends AeadKey {
public SecretBytes getKeyBytes();
public 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-এ একাধিকবার আপলোড করলে
কখনও কখনও এটি ঘটে)। মনে রাখবেন যে আমরা
জাভা পদ্ধতি equals ওভাররাইড করি না, কারণ এর জন্য আমাদের
hashCode ওভাররাইড করতে হবে এবং অপ্রমাণিত অনুমান না করে equals-এর সাথে মানানসই
নিরাপদ উপায়ে hashCode প্রয়োগ করার কোনও উপায় নেই।
এরপর, আমাদের getParameters() পদ্ধতি প্রয়োজন। এটি ব্যবহারকারীদের 'কী' তৈরি করার জন্য ব্যবহৃত প্যারামিটার সম্পর্কে
আসল তথ্য পেতে দেয়।
সবশেষে, AesGcmKey-এর একটি পদ্ধতি getKeyBytes আছে যা র' কী মেটেরিয়াল ফিরিয়ে দেয়।
এই ধরনের পদ্ধতিগুলি কী ক্লাসের জন্য খুবই সাধারণ: এগুলি নির্দিষ্ট ধরনের,
এবং অন্তর্নিহিত কী মেটেরিয়ালে অ্যাক্সেস প্রদান করে। এগুলি ব্যবহার করে, ব্যবহারকারীরা
নীতিগতভাবে, যেমন, 'কী' দ্বারা উপস্থাপিত প্রিমিটিভ প্রয়োগ করতে পারেন,
অথবা ডিস্কে স্টোর করতে বা নেটওয়ার্কে পাঠাতে
'কী' সিরিয়ালাইজ করতে পারেন। অননুমোদিত অ্যাক্সেস থেকে 'কী' মেটেরিয়াল সুরক্ষিত রাখার দায়িত্ব 'কী'-এরই। যেমন, SecretBytes-এর ক্ষেত্রে,
আসলে মেটেরিয়াল প্রদান করার জন্য অ্যাক্সেস টোকেন প্রয়োজন
(অ্যাক্সেস কন্ট্রোল দেখুন)।
অ্যাসিমেট্রিক কী
অ্যাসিমেট্রিক প্রিমিটিভের জন্য, Tink দুটি কী ক্লাস ব্যবহার করে, একটি ব্যক্তিগত এবং একটি সর্বজনীন কী-এর জন্য। প্যারামিটারের জন্য, একই ক্লাস ব্যবহার করা আরও সুবিধাজনক (যেহেতু শুধুমাত্র একটি ক্লাস আছে যা কী তৈরি করতে ব্যবহার করা যেতে পারে)।
এছাড়াও, Tink-এর একটি ইন্টারফেস PrivateKey আছে যার সাথে অতিরিক্ত
ফাংশন getPublicKey() আছে।