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