Na prática, o Tink fornece objetos Key para representar
keys e objetos Parameters para representar Parameters.
Por exemplo, em Java, temos objetos AesGcmKey para
representam chaves AES GCM.
Nesta seção, explicamos como esses objetos são projetados em Java e como eles interagem.
Parameters objetos
Considere o AES GCM, um esquema de criptografia AEAD amplamente utilizado.
O Tink fornece um objeto AesGcmParameters com as informações necessárias para
criar um AesGcmKey, que vamos explicar mais tarde.
A hierarquia de parâmetros em Java tem a seguinte aparência:
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() {...}
}
Conforme explicado na seção
Conjuntos de chaves, inclusão de tags em textos criptografados,
Algumas chaves têm um requisito no ID quando estão em um conjunto de chaves. Todas
O objeto Parameters tem um método hasIdRequirement que especifica se o
a chave criada por esse objeto Parameters terá ou não um ID obrigatório.
Em seguida, o objeto AesGcmParameters fornece os métodos getKeySizeBytes(),
getIvSizeBytes() e getTagSizeBytes(). Elas retornam os comprimentos
a chave usada, o comprimento do IV usado e o comprimento da tag produzida,
em bytes. Embora o Tink forneça algumas dessas funções para integridade, ela
nem sempre permite a criação de Aeads para cada escolha. Por exemplo, atualmente
somente IVs de 12 bytes são suportados para o AES GCM.
O objeto AesGcmParameters também substitui as operações anteriores
métodos definidos (e os métodos padrão do Java equals e hashCode)
o que é considerado uma boa prática).
Por fim, ela fornece métodos estáticos para criar novos objetos AeadParameters.
Eles validam as entradas, ou seja, verificam se o tamanho é 16, 24,
ou 32.
Objetos-chave
O Tink também tem uma hierarquia de chaves. Ainda com nosso exemplo do AES GCM, parece assim:
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);
}
O método getIdRequirementOrNull retorna o ID que essa chave precisa ter,
ou null se não houver requisito.
Essa exigência na chave vem do fato de que o Tink, em alguns casos,
prefixos de textos criptografados ou assinaturas com a string 0x01<id>, consulte a seção
sobre inclusão de tag de texto criptografado).
Isso sempre será consistente com o resultado de
getParameters().hasIdRequirement() e os implementadores de novas
classes importantes precisam garantir isso.
As implementações de Key também precisam fornecer um método equalsKey para
e comparar chaves diferentes. Essas
um método costuma ser útil. Por exemplo, ao testar a derivação de chave, uma é
interessados em garantir que a aplicação repetida da derivação produza
o mesmo objeto-chave. Além disso, um KMS pode querer verificar se alguma das chaves
que fornece a diferentes usuários são iguais (o que acontece às vezes se os usuários compartilham
e fazer o upload delas no mesmo KMS várias vezes). É notório que
não modifique o método Java equals, porque isso exigiria que
substituir hashCode, e não há como implementar hashCode em um ambiente
maneira compatível com equals sem fazer suposições não comprovadas.
Em seguida, precisamos de um método getParameters(). Isso permite que os usuários recebam
informações originais sobre os parâmetros usados para criar a chave.
Por fim, AesGcmKey tem um método getKeyBytes que retorna o material bruto da chave.
Esses métodos são muito comuns para classes-chave: são específicos para o tipo,
e fornecem acesso ao material de chave subjacente. Com isso, os usuários
pode, em princípio, por exemplo, implementar o primitivo representado pela chave,
serializar a chave para armazená-la em disco ou enviá-la pelo
em uma rede VPC. A própria chave é responsável por proteger o material dela contra
acesso não autorizado. Por exemplo, SecretBytes requer um token de acesso para
fornecer o material
Consulte Controle de acesso.
Chaves assimétricas
Para primitivos assimétricos, o Tink usa duas classes Key, uma para particular e outra para chaves públicas. Em Parâmetros, é mais conveniente usar a mesma , já que há apenas uma classe que pode ser usada para gerar as chaves.
O Tink também tem uma interface PrivateKey com os outros
função getPublicKey().