Pratikte Tink, anahtarları temsil etmek için Key
nesneleri ve Parameters
nesnelerini temsil etmek için Parameters
nesnelerini sağlar.
Örneğin, Java'da AES GCM anahtarlarını temsil edecek AesGcmKey
nesnelerimiz vardır.
Bu bölümde bu nesnelerin Java'da nasıl tasarlandığını ve nasıl etkileşimde bulunduklarını açıklıyoruz.
Parameters
nesneleri
Yaygın olarak kullanılan bir AEAD şifreleme düzeni olan AES GCM'yi düşünün.
Tink, AesGcmKey
oluşturmak için gerekli bilgileri içeren bir AesGcmParameters
nesnesi sağlar. Bu konuyu daha sonra açıklayacağız.
Java'daki parametre hiyerarşisi aşağıdaki gibi görünür:
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() {...}
}
Tuş Kümeleri, Şifrelenmiş Metinleri Etiketleme bölümünde açıklandığı gibi, tuş kümelerinde bulunan bazı anahtarların kimliklerine ilişkin bir zorunluluk vardır. Her Parameters
nesnesi, bu Parameters
nesnesi tarafından oluşturulan anahtarın böyle bir gerekli kimliğe sahip olup olmayacağını belirten bir hasIdRequirement
yöntemine sahiptir.
Ardından AesGcmParameters
nesnesi getKeySizeBytes()
, getIvSizeBytes()
ve getTagSizeBytes()
yöntemlerini sağlar. Bunlar; kullanılan anahtarın, kullanılan IV değerinin ve üretilen etiketin uzunluğunu bayt cinsinden döndürür. Tink, bu işlevlerden bazılarını eksiksiz hale getirmek amacıyla sağlar, ancak her seçim için Aead
oluşturulmasına her zaman izin vermez. Örneğin, şu anda AES GCM için yalnızca 12 baytlık IV'ler desteklenmektedir.
AesGcmParameters
nesnesi ayrıca daha önce tanımlanan yöntemler (ve iyi uygulama olarak kabul edilen equals
ile hashCode
Java standart yöntemleri) için geçersiz kılmalar da sağlar.
Son olarak, yeni AeadParameters
nesneleri oluşturmak için statik yöntemler sağlar.
Bunlar, girişleri doğrular. Yani boyutun 16, 24 veya 32 değerlerinden biri olup olmadığını kontrol ederler.
Anahtar nesneler
Tink'in de bir anahtar hiyerarşisi vardır. AES GCM örneğimizden devam edersek aşağıdaki gibi görünür:
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
yöntemi, bu anahtarın sahip olması gereken kimliği veya herhangi bir gereklilik yoksa null
değerini döndürür.
(Anahtarla ilgili bu tür bir gereksinim, bazı durumlarda Tink'in bazı durumlarda şifrelenmiş metinlerin veya imzaların 0x01<id>
dizesiyle önüne eklenmesinden kaynaklanır. Şifre metni etiketleme hakkındaki bölüme bakın.)
Bu, getParameters().hasIdRequirement()
sonucuyla her zaman tutarlı olur ve yeni anahtar sınıflarının uygulayıcılarının bunu sağlaması gerekir.
Key
uygulamalarında, farklı anahtarları karşılaştırmak için bir equalsKey
yöntemi de sunulması gerekir. Bu tür bir yöntem genellikle yararlıdır: Örneğin, anahtar türetimi test edilirken, türetmenin tekrarlanan uygulamasının aynı anahtar nesneyi vermesini sağlamak amaçlanır. Ayrıca, bir KMS farklı kullanıcılara sağladığı anahtarlardan herhangi birinin eşit olup olmadığını kontrol etmek isteyebilir (bazen kullanıcılar anahtarları paylaşır ve aynı KMS'ye birden fazla kez yüklerse bu olur). Java yöntemini equals
geçersiz kılmamamız dikkate değer. Çünkü bu, hashCode
politikasını geçersiz kılmamızı gerektirecektir ve kanıtlanmamış varsayımlarda bulunmadan hashCode
öğesini equals
ile uyumlu bir şekilde güvenli bir şekilde uygulamanın hiçbir yolu yoktur.
Şimdi, bir getParameters()
yöntemi gerekiyor. Bu sayede kullanıcılar, anahtarı oluşturmak için kullanılan Parametreler hakkında orijinal bilgileri alabilir.
Son olarak AesGcmKey
, ham anahtar materyalini döndüren bir getKeyBytes
yöntemine sahiptir.
Bu tür yöntemler, temel sınıflar için çok tipiktir: Türe özeldir ve temel anahtar materyale erişim sağlar. Kullanıcılar bunları kullanarak prensip olarak anahtarın temsil ettiği temel öğeyi uygulayabilir veya anahtarı diskte depolamak ya da ağ üzerinden göndermek için seri hale getirebilir. Anahtarın kendisi, anahtar materyalini yetkisiz erişime karşı korumaktan sorumludur. Örneğin SecretBytes
, materyali gerçekten sağlamak için erişim jetonu gerektirir (Erişim Kontrolü'ne bakın).
Asimetrik Anahtarlar
Tink, asimetrik temel öğelerde biri özel, diğeri ortak anahtarlar için olmak üzere iki Anahtar sınıfı kullanır. Parametreler için aynı sınıfı kullanmak daha uygundur (anahtarları oluşturmak için kullanılabilecek yalnızca bir sınıf vardır).
Tink, getPublicKey()
ek işlevine sahip PrivateKey
arayüzüne de sahiptir.