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