কী এবং পরামিতি অবজেক্ট

অনুশীলনে, Tink কীগুলি উপস্থাপন করার জন্য Key অবজেক্ট এবং Parameters উপস্থাপন করার জন্য পরামিতিগুলি প্রদান করে Parameters উদাহরণস্বরূপ, জাভাতে, AES GCM কীগুলিকে উপস্থাপন করার জন্য আমাদের কাছে AesGcmKey অবজেক্ট রয়েছে।

এই বিভাগে, আমরা ব্যাখ্যা করি যে কীভাবে এই বস্তুগুলি জাভাতে ডিজাইন করা হয়েছে এবং কীভাবে তারা ইন্টারঅ্যাক্ট করে।

Parameters বস্তু

AES GCM বিবেচনা করুন, একটি বহুল ব্যবহৃত AEAD এনক্রিপশন স্কিম। Tink একটি AesGcmParameters অবজেক্ট প্রদান করে একটি AesGcmKey তৈরি করার জন্য প্রয়োজনীয় তথ্য সহ, যা আমরা পরে ব্যাখ্যা করি। জাভাতে পরামিতি শ্রেণিবিন্যাস নিম্নরূপ দেখায়:

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, Tagging Ciphertexts বিভাগে যেমন ব্যাখ্যা করা হয়েছে, কিছু কী তাদের আইডিতে একটি প্রয়োজনীয়তা থাকে, যখন সেগুলি একটি কীসেটে থাকে। প্রতিটি Parameters অবজেক্টের একটি পদ্ধতি hasIdRequirement রয়েছে যা নির্দিষ্ট করে যে এই Parameters অবজেক্টের দ্বারা তৈরি কীটির এমন একটি প্রয়োজনীয় আইডি থাকবে কি না।

পরবর্তী AesGcmParameters অবজেক্টটি getKeySizeBytes() , getIvSizeBytes() , এবং getTagSizeBytes() পদ্ধতি প্রদান করে। এগুলি ব্যবহৃত কীটির দৈর্ঘ্য, ব্যবহৃত IV এর দৈর্ঘ্য এবং উত্পাদিত ট্যাগের দৈর্ঘ্য বাইটে ফেরত দেয়। যদিও Tink সম্পূর্ণতার জন্য এই ফাংশনগুলির কিছু প্রদান করে, এটি সর্বদা প্রতিটি পছন্দের জন্য Aead তৈরি করার অনুমতি দেয় না। উদাহরণস্বরূপ, বর্তমানে AES GCM এর জন্য শুধুমাত্র 12 বাইট IV সমর্থিত।

AesGcmParameters অবজেক্ট পূর্বে সংজ্ঞায়িত পদ্ধতিগুলির জন্য ওভাররাইড প্রদান করে (এবং জাভা স্ট্যান্ডার্ড পদ্ধতি 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 প্রদান করতে হবে। এই ধরনের একটি পদ্ধতি প্রায়শই দরকারী: উদাহরণস্বরূপ কী ডেরিভেশন পরীক্ষা করার সময়, কেউ নিশ্চিত করতে আগ্রহী যে ডেরিভেশনের বারবার প্রয়োগ একই কী অবজেক্ট লাভ করে। এছাড়াও, একটি কেএমএস বিভিন্ন ব্যবহারকারীদের প্রদান করে এমন কোন কী সমান কিনা তা পরীক্ষা করতে চাইতে পারে (যা কখনও কখনও ব্যবহারকারীরা কীগুলি ভাগ করে এবং একই কেএমএসে একাধিকবার আপলোড করলে)। এটা উল্লেখযোগ্য যে আমরা জাভা মেথড equals ওভাররাইড করি না, কারণ এর জন্য আমাদের hashCode ওভাররাইড করতে হবে, এবং অপ্রমাণিত অনুমান না করেই equals সাথে সামঞ্জস্যপূর্ণ নিরাপদ উপায়ে hashCode প্রয়োগ করার কোন উপায় নেই।

এর পরে, আমাদের একটি পদ্ধতি প্রয়োজন getParameters() । এটি ব্যবহারকারীদের কী তৈরি করতে ব্যবহৃত পরামিতি সম্পর্কে মূল তথ্য পেতে অনুমতি দেয়।

অবশেষে, AesGcmKey একটি পদ্ধতি আছে getKeyBytes যা কাঁচা কী উপাদান ফেরত দেয়। এই জাতীয় পদ্ধতিগুলি কী ক্লাসের জন্য খুব সাধারণ: এগুলি প্রকারের জন্য নির্দিষ্ট, এবং অন্তর্নিহিত কী উপাদানগুলিতে অ্যাক্সেস সরবরাহ করে। সেগুলি ব্যবহার করে, ব্যবহারকারীরা নীতিগতভাবে যেমন কী দ্বারা উপস্থাপিত আদিম প্রয়োগ করতে পারে, বা ডিস্কে সংরক্ষণ করতে বা নেটওয়ার্কে পাঠানোর জন্য কীটিকে সিরিয়ালাইজ করতে পারে। মূল উপাদানটিকে অননুমোদিত অ্যাক্সেসের বিরুদ্ধে রক্ষা করার জন্য কী নিজেই দায়ী। উদাহরণ স্বরূপ, SecretBytes আসলে উপাদান প্রদান করার জন্য একটি অ্যাক্সেস টোকেন প্রয়োজন (দেখুন অ্যাক্সেস কন্ট্রোল )।

অপ্রতিসম কী

অসমমিতিক আদিমগুলির জন্য, টিঙ্ক দুটি কী ক্লাস ব্যবহার করে, একটি ব্যক্তিগত এবং একটি সর্বজনীন কীগুলির জন্য। পরামিতিগুলির জন্য, একই ক্লাস ব্যবহার করা আরও সুবিধাজনক (যেহেতু কেবল একটি শ্রেণী রয়েছে যা কীগুলি তৈরি করতে ব্যবহার করা যেতে পারে)।

Tink-এর অতিরিক্ত ফাংশন getPublicKey() সহ একটি ইন্টারফেস PrivateKey রয়েছে।