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