Tink, anahtar rotasyonunu etkinleştirmek için anahtar kümelerini kullanır. Resmi olarak bir anahtar grubu, bir anahtarın birincil olarak belirlendiği (ör. yeni açık metinleri imzalamak ve şifrelemek için kullanılan anahtar) boş olmayan bir anahtar listesidir1. Ayrıca, bir anahtar grubundaki anahtarlar benzersiz bir kimlik2 ve anahtar grubundan kaldırmadan devre dışı bırakmalarına olanak tanıyan bir anahtar durumu alır.
Anahtar kümeleri, kullanıcıların anahtarlara erişebilmesinin ana yoludur (KeysetHandle
sınıfı aracılığıyla). Bu sayede her kullanıcının aynı anda birden fazla anahtarı işleyebileceği bir kodu olur. Kriptografi kullanan çoğu kullanıcı için birden fazla anahtar kullanmak zorunludur: Anahtarları değiştirmek mümkün olmalıdır (ör. eski anahtarlar sızdırılabilir) ve kodun çalıştığı makinelere ve tüm şifre metinlerine küresel olarak ve anında uygulanabilecek neredeyse hiçbir atomik "sonraki anahtara geç" işlevi yoktur. Bu nedenle, kullanıcının bir anahtardan diğerine geçiş yapıldığında çalışan kod yazması gerekir.
Örnek: AEAD
AEAD ilkel için birden fazla anahtar içeren bir AEAD anahtar grubunu düşünün. Daha önce de açıklandığı gibi, her anahtar iki işlevi benzersiz şekilde belirtir: \(\mathrm{Enc}\) ve \(\mathrm{Dec}\). Anahtar grubu artık iki yeni işlev de belirtir: \(\mathrm{Enc}\) ve \(\mathrm{Dec}\) . \(\mathrm{Enc}\) , anahtar grubunun birincil anahtarının \(\mathrm{Enc}\) işlevine eşittir. \(\mathrm{Dec}\) işlevi ise tüm anahtarlarla şifreyi çözmeye çalışır ve bunları belirli bir sırada işler (Tink'in bunun performansını nasıl iyileştirdiğine dair bilgi için aşağıya bakın).
Anahtar gruplarının tam anahtarlar olduğunu belirtmek ilginçtir: Bunlar, kullanılan işlevlerin \(\mathrm{Enc}\) ve\(\mathrm{Dec}\) tam bir açıklamasıdır. Bu, kullanıcıların KeysetHandle
girişi alan bir sınıf yazabileceği anlamına gelir. Bu sınıf, sınıfın nesnelerin tam açıklamasına \(\mathrm{Enc}\) ve \(\mathrm{Dec}\) doğru şekilde çalışmasına ihtiyacı olduğunu ifade eder. Bu, kullanıcının şunu belirten API'ler yazmasına olanak tanır: Bu sınıfı kullanmak için bana bir kriptografik ilkel açıklamasını sağlamanız gerekir.
Anahtar rotasyonu
Önce bir KMS'den anahtar grubu alan, ardından bu anahtar grubundan AEAD nesnesi oluşturan ve son olarak bu nesneyi şifre metinlerini şifrelemek ve şifresini çözmek için kullanan bir Tink kullanıcısını düşünün.
Bu tür bir kullanıcı, anahtar rotasyonu ve mevcut seçimi artık standardı karşılamıyorsa algoritma değiştirme için otomatik olarak hazırlanır.
Ancak bu tür bir anahtar rotasyonu uygulanırken biraz dikkatli olmak gerekir: İlk olarak, KMS anahtar grubuna yeni bir anahtar eklemelidir (ancak henüz birincil olarak ayarlamaz). Ardından, yeni anahtar grubunun tüm ikili dosyalara dağıtılması gerekir. Böylece, bu anahtar grubunu kullanan her ikili dosyada anahtar grubunun en yeni anahtarı bulunur. Yeni anahtar ancak bu durumda birincil hale getirilmeli ve ortaya çıkan anahtar grubu, anahtar grubunu kullanan tüm ikililere tekrar dağıtılmalıdır.
Şifre metinlerindeki anahtar tanımlayıcıları
AEAD anahtar grubu örneğini tekrar ele alalım. Basit bir şekilde yapılırsa şifrelenmiş metnin şifresini çözmek için Tink'in anahtar grubunu şifrelemek için hangi anahtarın kullanıldığını bilmenin bir yolu olmadığından anahtar grubundaki tüm anahtarlarla şifreyi çözmeyi denemesi gerekir. Bu durum, performansta büyük bir yükü beraberinde getirebilir.
Bu nedenle Tink, şifrelenmiş metinlere kimlikten türetilen 5 baytlık bir dize ön ekleyerek eklemenize olanak tanır. Yukarıdaki "Tam Anahtarlar" felsefesine göre bu ön ek anahtarın bir parçasıdır ve bu anahtarla oluşturulan tüm şifre metinlerinde bu ön ek bulunmalıdır. Kullanıcılar anahtar oluştururken anahtarın bu tür bir ön ek kullanıp kullanmayacağını veya bu ön ek olmadan bir şifre metni biçiminin kullanılıp kullanılmayacağını seçebilir.
Bir anahtar bir anahtar grubunda olduğunda Tink, bu etiketi anahtarın anahtar grubundaki kimliğinden hesaplar. Kimliklerin bir anahtar grubu içinde benzersiz olması2, etiketlerin de benzersiz olduğu anlamına gelir. Bu nedenle, yalnızca etiketli anahtarlar kullanılırsa tek bir anahtarla şifre çözmeye kıyasla performans kaybı olmaz: Tink'in şifreyi çözerken anahtarlardan yalnızca birini denemesi gerekir.
Ancak etiket anahtarın bir parçası olduğundan bu, anahtarın yalnızca belirli bir kimliğe sahipse bir anahtar grubunda bulunabileceği anlamına da gelir. Bu durum, anahtar nesnelerin farklı dillerde uygulanmasını açıklarken bazı sonuçlara yol açar.
-
Tink'in bazı bölümleri, anahtar kümelerini hâlâ bir küme olarak ele alıyor. Ancak bu durum değiştirilmelidir. Bunun nedeni, sıranın genellikle önemli olmasıdır: Örneğin, Aead ile anahtar rotasyonunun tipik yaşam döngüsünü düşünün. Öncelikle, anahtar grubuna yeni bir anahtar eklenir. Bu anahtar henüz birincil anahtar olarak ayarlanmamış ancak etkin. Bu yeni anahtar grubu tüm ikili dosyalarda kullanıma sunulmuştur. Tüm ikili dosyalar yeni anahtarı öğrendikten sonra anahtar birincil hale getirilir (yalnızca bu noktada bu anahtarı kullanmak güvenlidir). Bu ikinci adımda, anahtar rotasyonunun eklenen son anahtarı bilmesi gerekir. ↩
-
Tink, Google'ın dahili kitaplığıyla uyumluluk için kimliklerin tekrarlandığı anahtar kümelerine sahip olmaya olanak tanır. Bu desteğin desteği gelecekte sonlandırılacak. ↩