Objetos de clave y parámetros

En la práctica, Tink proporciona objetos Key para representar keys y objetos Parameters para representar Parameters. Por ejemplo, en Java, tenemos objetos AesGcmKey para representan claves AES de GCM.

En esta sección, se explica cómo se diseñan estos objetos en Java y cómo interactúan.

Parameters objetos

Considera AES GCM, un esquema de encriptación AEAD muy usado. Tink proporciona un objeto AesGcmParameters con la información necesaria para Crea un AesGcmKey, que explicaremos más adelante. La jerarquía de parámetros en Java se ve de la siguiente manera:

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() {...}
}

Como se explica en la sección Conjuntos de claves, etiquetado de textos cifrados, algunas claves tienen un requisito en su ID, cuando están en un conjunto de claves. Cada El objeto Parameters tiene un método hasIdRequirement que especifica si la La clave creada por este objeto Parameters tendrá ese ID obligatorio o no.

El objeto AesGcmParameters proporciona los métodos getKeySizeBytes(), getIvSizeBytes() y getTagSizeBytes(). Estos devuelven las longitudes de la clave utilizada, la longitud del IV utilizado y la longitud de la etiqueta producida, en bytes. Si bien Tink proporciona algunas de estas funciones para lograr una integridad, no siempre permite crear Aead para cada opción. Por ejemplo, actualmente solo se admiten IV de 12 bytes para AES GCM.

El objeto AesGcmParameters también proporciona anulaciones para los valores anteriores los métodos definidos (y los métodos estándar de Java equals y hashCode) lo cual se considera una buena práctica).

Por último, proporciona métodos estáticos para crear nuevos objetos AeadParameters. Estos validan las entradas, es decir, verifican que el tamaño sea de 16, 24. o 32.

Objetos clave

Tink también tiene una jerarquía de claves. Siguiendo con nuestro ejemplo de AES GCM, parece así:

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);
}

El método getIdRequirementOrNull muestra el ID que debe tener esta clave. o null si no hay requisitos. (Este requisito sobre la clave se debe a que Tink, en algunos casos, prefijos a textos cifrados o firmas con la cadena 0x01<id>; consulta la sección en el etiquetado de texto cifrado).

Esto siempre será coherente con el resultado de getParameters().hasIdRequirement() e implementadores de nuevas las clases clave deben garantizar esto.

Las implementaciones de Key también deben proporcionar un método equalsKey para lo siguiente: comparar claves diferentes. Tales un método suele ser útil: por ejemplo, al probar la derivación de claves, interesado en garantizar que la aplicación repetida de la derivación produzca el mismo objeto clave. Además, un KMS podría querer verificar si alguna de las claves que proporciona a los diferentes usuarios son iguales (lo que a veces sucede si los usuarios comparten y subirlas al mismo KMS varias veces). Es notable que no anulen el método de Java equals, ya que esto requeriría que anular hashCode y no hay forma de implementar hashCode en un entorno seguro de manera compatible con equals sin hacer suposiciones no comprobadas.

A continuación, necesitamos un método getParameters(). Esto permite que los usuarios obtengan la información original sobre los parámetros que se usaron para crear la clave.

Por último, AesGcmKey tiene un método getKeyBytes que muestra el material de clave sin procesar. Esos métodos son muy típicos para las clases clave: son específicos para el tipo, y proporcionan acceso al material de clave subyacente. Con ellas, los usuarios puede, en principio, p.ej., implementar la primitiva que representa la clave, o serializar la clave para almacenarla en el disco o enviarla por en cada red. La clave en sí es responsable de proteger el material de claves contra de accesos no autorizados. Por ejemplo, SecretBytes requiere un token de acceso para realizar lo siguiente: proporcionan el material (consulta Control de acceso).

Claves asimétricas

En el caso de las primitivas asimétricas, Tink usa dos clases de clave: una para la privacidad y otra para las primitivas. para las claves públicas. Para los parámetros, es más conveniente usar el mismo (ya que solo hay una que puede usarse para generar las claves).

Tink también tiene una interfaz PrivateKey con el elemento función getPublicKey().