Objetos de chave e parâmetros

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