Dalam praktiknya, Tink menyediakan objek Key untuk diwakili
keys dan objek Parameters untuk mewakili Parameters.
Misalnya, di Java, kita memiliki objek AesGcmKey untuk
mewakili kunci AES GCM.
Dalam bagian ini, kami akan menjelaskan bagaimana objek ini didesain di Java dan bagaimana objek tersebut berinteraksi.
Parameters objek
Pertimbangkan AES GCM, skema enkripsi AEAD yang banyak digunakan.
Tink memberikan objek AesGcmParameters dengan informasi yang diperlukan untuk
membuat AesGcmKey, yang akan kami jelaskan nanti.
Hierarki parameter di Java terlihat seperti berikut:
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() {...}
}
Seperti yang dijelaskan di bagian
Keyset, Pemberian Tag Ciphertext,
beberapa kunci memiliki persyaratan pada ID-nya, ketika mereka berada dalam {i>keyset<i}. Setiap
Objek Parameters memiliki metode hasIdRequirement yang menentukan apakah
kunci yang dibuat oleh objek Parameters ini akan memiliki ID yang diperlukan atau tidak.
Selanjutnya objek AesGcmParameters menyediakan metode getKeySizeBytes(),
getIvSizeBytes(), dan getTagSizeBytes(). Ini mengembalikan panjang
kunci yang digunakan, panjang IV yang
digunakan, dan panjang {i>tag<i} yang dihasilkan,
dalam byte. Meskipun Tink menyediakan beberapa fungsi ini untuk kelengkapan,
tidak selalu mengizinkan pembuatan Aead untuk setiap pilihan. Misalnya, saat ini
hanya IV 12 byte yang
didukung untuk AES GCM.
Objek AesGcmParameters juga menyediakan penggantian untuk elemen
metode yang ditentukan (dan metode standar Java equals dan hashCode
yang dianggap sebagai praktik yang baik).
Terakhir, menyediakan metode statis untuk membuat objek AeadParameters baru.
Ini memvalidasi input, yaitu, mereka memeriksa bahwa ukurannya adalah salah satu dari 16, 24,
atau 32.
Objek utama
Tink juga memiliki hierarki kunci. Tetap menggunakan contoh AES GCM, terlihat seperti ini:
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);
}
Metode getIdRequirementOrNull menampilkan ID yang harus dimiliki kunci ini,
atau null jika tidak ada persyaratan.
(Persyaratan seperti ini berasal dari fakta bahwa Tink dalam beberapa kasus
teks tersandi awalan atau tanda tangan dengan string 0x01<id>, lihat bagian
tentang pemberian tag teks tersandi).
Ini akan selalu konsisten
dengan hasil dari
getParameters().hasIdRequirement() dan pengimplementasi
kelas utama perlu memastikan hal ini.
Implementasi Key juga harus menyediakan metode equalsKey untuk
membandingkan kunci yang berbeda. Seperti
suatu metode sering kali berguna: misalnya saat menguji turunan kunci, salah satunya adalah
tertarik untuk memastikan bahwa penerapan
dari hasil turunan secara berulang
objek kunci yang sama. KMS juga perlu memeriksa
apakah ada kunci yang
berikan kepada pengguna yang berbeda sama (yang kadang-kadang terjadi jika pengguna berbagi
kunci dan menguploadnya ke KMS yang sama beberapa kali). Perlu dicatat bahwa kita
jangan mengganti metode Java equals, karena ini mengharuskan kita untuk
mengganti hashCode, dan tidak ada cara untuk menerapkan hashCode dalam
yang kompatibel dengan equals tanpa membuat asumsi yang tidak terbukti.
Selanjutnya, kita memerlukan metode getParameters(). Hal ini memungkinkan pengguna mendapatkan
informasi asli tentang Parameter yang digunakan untuk membuat kunci.
Terakhir, AesGcmKey memiliki metode getKeyBytes yang menampilkan materi kunci mentah.
Metode ini sangat umum untuk class kunci: metode ini spesifik untuk jenisnya,
dan menyediakan akses
ke materi kunci yang mendasarinya. Dengan menggunakan hal tersebut, pengguna akan
pada prinsipnya, misalnya menerapkan primitif yang
direpresentasikan oleh kunci tersebut,
atau melakukan serialisasi kunci untuk
menyimpannya di {i>disk<i} atau mengirimkannya melalui
jaringan. Kunci itu sendiri bertanggung jawab
untuk melindungi materi kunci dari
akses yang tidak sah. Misalnya, SecretBytes memerlukan token akses untuk
benar-benar menyediakan materi
(lihat Kontrol Akses).
Kunci Asimetris
Untuk primitif asimetris, Tink menggunakan dua class Key, satu untuk pribadi dan satu lagi untuk kunci publik. Untuk Parameter, akan lebih mudah untuk menggunakan parameter (karena hanya ada satu class yang dapat digunakan untuk membuat kunci).
Tink juga memiliki antarmuka PrivateKey dengan tambahan
fungsi getPublicKey().