ออบเจ็กต์คีย์และพารามิเตอร์

ในทางปฏิบัติ 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() {...}
}

ตามที่อธิบายไว้ในส่วน คีย์เซ็ต การเข้ารหัสข้อความสำหรับการติดแท็ก คีย์บางรายการมีข้อกำหนดในรหัสของตนเมื่ออยู่ในชุดคีย์ ทุก ออบเจ็กต์ Parameters มีเมธอด hasIdRequirement ซึ่งระบุว่าเมธอด คีย์ที่สร้างโดยออบเจ็กต์ Parameters นี้จะมีรหัสที่จำเป็นดังกล่าวหรือไม่มี

ออบเจ็กต์ AesGcmParameters ถัดไประบุเมธอด getKeySizeBytes() getIvSizeBytes() และ getTagSizeBytes() ซึ่งจะแสดงความยาวของ คีย์ที่ใช้ ความยาวของ IV ที่ใช้ และความยาวของแท็กที่สร้างขึ้น ในหน่วยไบต์ แม้ว่า Tink จะมีฟังก์ชันต่อไปนี้บางส่วนเพื่อความสมบูรณ์ ไม่อนุญาตให้สร้าง Aead สำหรับตัวเลือกทั้งหมดทุกครั้ง ตัวอย่างเช่น ปัจจุบัน ระบบสนับสนุน IV ขนาด 12 ไบต์เท่านั้นสำหรับ AES GCM

ออบเจ็กต์ AesGcmParameters ยังให้การลบล้างสำหรับ เมธอดที่กำหนดไว้ (และเมธอดมาตรฐาน Java equals และ hashCode) ซึ่งถือเป็นแนวทางปฏิบัติที่ดี)

สุดท้ายก็ระบุวิธีการแบบคงที่ในการสร้างออบเจ็กต์ AeadParameters ใหม่ ซึ่งจะตรวจสอบอินพุต เช่น มีขนาด 16, 24 หรือ 32

ออบเจ็กต์หลัก

นอกจากนี้ Tink ยังมีลำดับชั้นคีย์ด้วย เมื่อมองจากตัวอย่าง GCM ของ AES ดังนี้

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 ใช้คลาสคีย์ 2 คลาส คลาสหนึ่งสำหรับ Private และ 1 เป็นคีย์สาธารณะ สำหรับพารามิเตอร์ เราสะดวกมากกว่าที่จะใช้ (เนื่องจากมีเพียงคลาสเดียวที่ใช้สร้างคีย์ได้)

Tink ยังมีอินเทอร์เฟซ PrivateKey ที่มีโอเปอเรเตอร์เพิ่มเติม ฟังก์ชัน getPublicKey()