Anahtar ve Parametre Nesneleri

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.