Anahtarlıklar

Tink, anahtar rotasyonunu etkinleştirmek için anahtar kümelerini kullanır. Resmi olarak, anahtar kümesi, bir anahtarın birincil olarak belirlendiği (örneğin, yeni düz metinleri imzalamak ve şifrelemek için kullanılan anahtar) boş olmayan bir anahtar listesidir1. Ayrıca, bir anahtar setindeki anahtarlar, anahtarların anahtar setinden kaldırılmadan devre dışı bırakılmasına olanak tanıyan benzersiz bir kimlik2 ve anahtar durumu alır.

Tuş takımları, kullanıcıların tuşlara erişebileceği temel yöntemdir (sınıf aracılığıyla KeysetHandle). Bu, her kullanıcının aynı anda birden fazla tuşu işleyebileceği bir koda sahip olmasını sağlar. Kriptografi kullanıcılarının çoğu için birden fazla anahtarı yönetmek bir zorunluluktur: Anahtarların değiştirilmesi gerekir (örneğin, eski anahtarlar sızdırılabilir) ve kodun çalıştığı makinelerde ve tüm şifreli metinlerde, küresel olarak ve anında uygulanabilecek atomik bir "bir sonraki anahtara geçiş" neredeyse hiç yoktur. Bu nedenle, kullanıcının bir anahtardan diğerine geçiş yapıldığında çalışan bir kod yazması gerekir.

Örnek: AEAD

AEAD temel öğesi için birden fazla anahtar içeren bir AEAD anahtar kümesi kullanın. Daha önce açıklandığı gibi, her anahtar iki işlevi benzersiz bir şekilde 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 işlevine \(\mathrm{Enc}\) eşittir. \(\mathrm{Dec}\) işlevi ise tüm anahtarlarla şifre çözmeye çalışır ve bunları belirli bir sırayla işler (Tink'in bu işlevin performansını nasıl iyileştirdiği hakkında bilgi için aşağıya bakın).

Anahtar kümelerinin tam anahtarlar olduğunu belirtmekte fayda var: Bunlar, işlevlerin tam bir açıklamasıdır \(\mathrm{Enc}\) ve \(\mathrm{Dec}\) kullanılır. Bu, kullanıcıların giriş olarak KeysetHandle alan bir sınıf yazabileceği anlamına gelir. Bu sınıf, düzgün çalışmak için nesnelerin eksiksiz bir açıklamasına \(\mathrm{Enc}\) ve \(\mathrm{Dec}\) ihtiyaç duyduğu fikrini ifade eder. Bu, kullanıcının şu iletişimi sağlayan API'ler yazmasına olanak tanır: Bu sınıfı kullanmak için bana kriptografik bir temel öğenin açıklamasını sağlamanız gerekir.

Anahtar rotasyonu

Öncelikle bir KMS'den anahtar grubu alan, ardından bu anahtar grubundan bir AEAD nesnesi oluşturan ve son olarak bu nesneyi şifreli metinleri şifrelemek ve şifrelerini çözmek için kullanan bir Tink kullanıcısını ele alalım.

Bu tür kullanıcılar, anahtar rotasyonuna ve mevcut seçimleri artık standardı karşılamadığında algoritma değiştirmeye otomatik olarak hazırlanır.

Ancak bu tür bir anahtar rotasyonu uygulanırken dikkatli olunması gerekir: İlk olarak, KMS anahtar grubuna yeni bir anahtar eklemelidir (ancak henüz birincil olarak ayarlamamalıdır). Ardından, bu anahtar kümesini kullanan her ikili programın anahtar kümesindeki en yeni anahtara sahip olması için yeni anahtar kümesinin tüm ikili programlarda kullanıma sunulması gerekir. Ancak bu durumda yeni anahtar birincil hale getirilmeli ve sonuçtaki anahtar grubu, anahtar grubunu kullanan tüm ikili dosyalara tekrar dağıtılmalıdır.

Şifreli metinlerdeki önemli tanımlayıcılar

AEAD anahtar kümesi örneğini tekrar ele alalım. Şifre çözme işlemi basit bir şekilde yapılırsa şifrelenmiş metnin şifresinin çözülmesi için Tink'in, anahtar kümesinin şifrelenmesinde hangi anahtarın kullanıldığını bilmenin bir yolu olmadığından anahtar kümesindeki tüm anahtarlarla şifre çözmeyi denemesi gerekir. Bu durum, büyük bir performans ek yüküne neden olabilir.

Bu nedenle Tink, şifreli metinlere kimlikten türetilmiş 5 baytlık bir dizeyle önek eklenmesine izin verir. Yukarıdaki "Tam Anahtarlar" felsefesine uygun olarak bu önek anahtarın bir parçasıdır ve bu anahtarla oluşturulan tüm şifreli metinler bu öneke sahip olmalıdır. Kullanıcılar anahtar oluştururken anahtarın bu tür bir önek kullanıp kullanmayacağını veya önek içermeyen bir şifreleme biçiminin kullanılıp kullanılmayacağını seçebilir.

Bir anahtar, anahtar kümesindeyken Tink bu etiketi, anahtarın anahtar kümesindeki kimliğinden hesaplar. Kimliklerin bir anahtar kümesi içinde benzersiz olması2, etiketlerin benzersiz olduğu anlamına gelir. Bu nedenle, yalnızca etiketli anahtarlar kullanılıyorsa tek bir anahtarla şifre çözme işlemine kıyasla performans kaybı olmaz: Tink, şifre çözme işlemi sırasında yalnızca anahtarlardan birini denemesi gerekir.

Ancak etiket anahtarın bir parçası olduğundan, anahtarın yalnızca belirli bir kimliği varsa anahtar kümesinde olabileceği de anlaşılır. Bu durum, önemli nesnelerin farklı dillerde uygulanmasını açıklarken bazı sonuçlar doğurur.

Kimlik gerektiren ancak çıkış öneki olmayan anahtarlar

Bazı anahtarların belirli bir kimliği olmalıdır ancak çıkışlarına önek eklenmez. Örneğin, NO_PREFIX_WITH_PREHASH_ID varyantına sahip imza anahtarları (WITH_ID_REQUIREMENT çıkış önek türüyle depolanır) öneksiz imzalar oluşturur. Bu tür bir anahtarı Prehash ilkel öğesiyle kullandığınızda Tink, anahtar kimliğini ön karma oluşturma değerine yazar. Böylece, uzak imzalayan, hangi anahtarıyla imza atacağını bilir.

Ön ek kullanan anahtarlarda olduğu gibi, bu tür bir anahtar yalnızca söz konusu kimliğin altındaki bir anahtar kümesinde olabilir. Ön karma değerindeki anahtar kimliği, çıktı öneki gibi düz meta verilerdir: İmza bunu bağlamaz ve doğrulayıcılar bunu asla görmez. Bayt düzeyindeki düzen için Tink tel biçimi başlıklı makaleyi inceleyin.


  1. Tink'in bazı bölümlerinde anahtar kümeleri hâlâ bir küme olarak ele alınır. 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ü ele alalım. Öncelikle, anahtar kümesine yeni bir anahtar eklenir. Bu anahtar henüz birincil anahtar olarak ayarlanmamış ancak etkin. Bu yeni anahtar grubu tüm ikili dosyalara dağıtılır. Tüm ikili dosyalar yeni anahtarı öğrendikten sonra anahtar birincil hale getirilir (yalnızca bu noktada bu anahtarın kullanılması güvenlidir). Bu ikinci adımda, anahtar rotasyonu için eklenen son anahtarın bilinmesi gerekir. ↩

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