Anahtarlıklar

Tink, anahtar rotasyonunu etkinleştirmek için Keysset'i kullanıyor. Resmî olarak anahtar kümesi, bir anahtarın birincil olduğu (örneğin, yeni şifrelenmemiş metinleri imzalamak ve şifrelemek için kullanılan anahtar) boş olmayan bir anahtar listesidir1. Ayrıca bir anahtar kümesindeki anahtarlar, benzersiz bir kimliğe2 ve anahtar kümesinden kaldırmadan anahtarları devre dışı bırakmaya olanak tanıyan bir anahtar durumuna sahip olur.

Anahtar kümeleri, kullanıcıların anahtarlara erişebilmelerini sağlayan ana yöntemdir (KeysetHandle sınıfı aracılığıyla). Bu, her kullanıcının aynı anda birden fazla anahtarı işleyecek koda sahip olmasını sağlar. Çoğu kriptografi kullanıcısı için birden fazla anahtarın kullanılması bir zorunluluktur: Anahtarların değiştirilmesi mümkün olmalıdır (örneğin, eski anahtarlar sızdırılabilir) ve kodun çalıştığı makinelere ve tüm şifrelenmiş metinlere küresel olarak ve anında uygulanabilecek atomik bir "sonraki anahtara geçiş" neredeyse hiçbir zaman yoktur. Bu nedenle, kullanıcının bir anahtardan diğerine geçiş yaptığında çalışan bir kod yazması gerekir.

Örnek: AEAD

AEAD temel öğesi için birden fazla anahtar içeren bir AEAD anahtar kümesi kullanmayı düşünün. Daha önce açıklandığı gibi, her anahtar benzersiz şekilde iki işlevi belirtir: \(\mathrm{Enc}\) ve \(\mathrm{Dec}\). Anahtar kümesi artık iki yeni işlev de belirtiyor: \(\mathrm{Enc}\) ve \(\mathrm{Dec}\) - \(\mathrm{Enc}\) basitçe, anahtar kümesinin birincil anahtarının \(\mathrm{Enc}\) işlevine eşittir. İşlev ise \(\mathrm{Dec}\) tüm anahtarların şifresini sırayla üzerinden geçerek tüm anahtarların şifresini çözmeye çalışır (Tin'in bu işlevi nasıl iyileştirdiğini görmek için aşağıdaki bölüme bakın).

Anahtar setlerinin tam tuşlar olduğunu bilmek ilginçtir. Bunlar, işlevlerin \(\mathrm{Enc}\) ve\(\mathrm{Dec}\) kullanılanların eksiksiz bir açıklamasıdır. Bu, kullanıcıların KeysetHandle girdisi alan bir sınıf yazabileceği ve sınıfın nesnelerin tam bir açıklamasına \(\mathrm{Enc}\) ve \(\mathrm{Dec}\) düzgün çalışması için gerektiği fikrini ifade edebileceği anlamına gelir. Bu, kullanıcının şu bilgiyi ileten API'ler yazmasını sağlar: Bu sınıfı kullanmak için bana bir temel kriptografi öğesinin açıklamasını sağlamanız gerekir.

Anahtar rotasyonu

Tink kullanıcısını düşünün. Önce bir KMS'den anahtar kümesi edinen, ardından bu anahtar kümesinden bir AEAD nesnesi oluşturan ve son olarak, şifrelenmiş metinleri şifrelemek ve şifrelerini çözmek için bu nesneyi kullanan bir program yazın.

Bu tür bir kullanıcı, anahtar rotasyonu için otomatik olarak hazırlanır ve mevcut seçiminin artık standardı karşılamaması durumunda algoritmalar arasında geçiş yapmak için hazırlanır.

Ancak bu tür anahtar rotasyonu uygularken biraz dikkatli olunması gerekir: Öncelikle, KMS anahtar kümesine yeni bir anahtar eklemelidir (ancak henüz birincil anahtar olarak ayarlamamalıdır). Ardından, yeni anahtar kümesinin tüm ikili programlar için kullanıma sunulması gerekir. Böylece, bu anahtar kümesini kullanan her ikili program, anahtar kümesindeki en yeni anahtara sahip olur. Ancak bunu yaptığınızda yeni anahtar birincil hale getirilmelidir ve sonuç olarak elde edilen anahtar kümesi, anahtar kümesi kullanılarak tüm ikili programlara tekrar dağıtılır.

Şifreli metinlerdeki anahtar tanımlayıcılar

AEAD anahtar kümesi örneğini tekrar inceleyin. Şifreli metnin şifresini çözmek, gizlice yapılırsa Tink'in Anahtar Kümesindeki tüm anahtarlarla şifreyi çözmeyi denemesi gerekir, çünkü anahtar kümesini şifrelemek için hangi anahtarın kullanıldığını bilmek mümkün değildir. Bu durum, büyük bir performans yüküne neden olabilir.

Bu nedenle Tink, şifrelenmiş metinlerin önüne kimlikten türetilmiş 5 baytlık bir dize ekler. Yukarıdaki "Tüm Anahtarlar" felsefesine göre bu ön ek anahtarın bir parçasıdır ve bu anahtarla türetilen tüm şifrelenmiş metinler bu ön eki taşımalıdır. Kullanıcılar anahtar oluştururken anahtarın böyle bir ön ek mi kullanacağını yoksa ön ek olmadan bir şifrelenmiş metin biçiminin mi kullanılacağını seçebilir.

Bir anahtar, anahtar kümesinde yer aldığında Tink, bu etiketi anahtarın anahtar kümesinde sahip olduğu kimlikten hesaplar. Bir anahtar kümesi içinde kimliklerin benzersiz2 olması, etiketlerin benzersiz olduğu anlamına gelir. Bu nedenle, yalnızca etiketli anahtarlar kullanılırsa tek bir anahtarla şifre çözme işlemine kıyasla hiçbir performans kaybı olmaz: Tink'in şifre çözme işlemi sırasında yalnızca anahtarlardan birini denemesi yeterlidir.

Bununla birlikte, etiket anahtarın bir parçası olduğundan bu, anahtarın yalnızca belirli bir kimliğin olması durumunda bir anahtar kümesinde bulunabileceği anlamına da gelir. Farklı dillerde anahtar nesnelerin uygulanmasını açıklarken, bunun bazı etkileri olabilir.


  1. Tink'in bazı bölümleri, anahtar setlerini hâlâ set olarak ele alır. Ancak bu değişiklik yapılmalıdır. Bunun nedeni sıranın genel olarak önemli olmasıdır: Örneğin, Aead ile bir anahtar rotasyonunun tipik yaşam döngüsünü düşünün. Öncelikle anahtar kümesine yeni bir anahtar eklenir. Bu anahtar henüz birincil değil, etkindir. Bu yeni tuş kümesi tüm ikili programlar için kullanıma sunuldu. Tüm ikili programlar yeni anahtarı öğrendikten sonra anahtar birincil yapılır (yalnızca bu noktada bu anahtarın kullanılması güvenlidir). Bu ikinci adımda, anahtar rotasyonunun eklenen son anahtarı bilmesi gerekir. 

  2. Tink, Google'ın kendi kitaplığıyla uyumluluk için kimliklerin tekrarlandığı anahtar kümelerine izin verir. Bu destek ileride kaldırılacaktır.