Oggetti chiave e parametri

In pratica, Tink fornisce Key oggetti da rappresentare chiavi e Parameters oggetti per rappresentare Parameters. Ad esempio, in Java, abbiamo AesGcmKey oggetti che rappresentano le chiavi AES GCM.

In questa sezione viene spiegato come sono progettati questi oggetti in Java e come interagire.

Parameters oggetti

Prendiamo ad esempio AES GCM, uno schema di crittografia AEAD ampiamente diffuso. Tink fornisce a un oggetto AesGcmParameters le informazioni necessarie per creare un AesGcmKey, che spiegheremo più avanti. La gerarchia dei parametri in Java ha il seguente aspetto:

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

Come spiegato nella sezione Set di chiavi, testi crittografati di tagging alcune chiavi hanno un requisito sul loro ID quando si trovano in un set di chiavi. Ogni evento L'oggetto Parameters ha un metodo hasIdRequirement che specifica se l'oggetto La chiave creata da questo oggetto Parameters avrà o meno questo ID richiesto.

L'oggetto AesGcmParameters successivamente fornisce i metodi getKeySizeBytes(), getIvSizeBytes() e getTagSizeBytes(). che restituiscono la lunghezza la chiave utilizzata, la lunghezza di IV utilizzato e la lunghezza del tag prodotto, in byte. Tink fornisce alcune di queste funzioni per completezza, non sempre consente di creare Aead per ogni scelta. Ad esempio, attualmente solo gli IV a 12 byte sono supportati per AES GCM.

L'oggetto AesGcmParameters fornisce anche override per la classe di lavoro precedente metodi definiti (nonché i metodi standard Java equals e hashCode che è considerata una buona prassi).

Infine, fornisce metodi statici per creare nuovi oggetti AeadParameters. Queste convalidano gli input, ovvero controllano che la dimensione sia uno di 16, 24, o 32.

Oggetti chiave

Tink ha anche una gerarchia di chiavi. Per continuare con l'esempio di AES GCM, sembra nel seguente modo:

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

Il metodo getIdRequirementOrNull restituisce l'ID necessario per questa chiave, oppure null in assenza di requisiti. (Questo requisito sulla chiave deriva dal fatto che, in alcuni casi, Tink) testi crittografati o firme con la stringa 0x01<id>, consulta la sezione sulla codifica del testo crittografato).

Sarà sempre coerente con il risultato getParameters().hasIdRequirement() e utenti che implementano nuovi che le classi chiave debbano farlo.

Le implementazioni di Key devono anche fornire un metodo equalsKey per mettere a confronto chiavi diverse. Tale spesso un metodo è utile: ad esempio, per testare la derivazione delle chiavi, è interessato a garantire che l'applicazione ripetuta della derivazione produca lo stesso oggetto chiave. Inoltre, un KMS potrebbe voler controllare se ci sono chiavi che fornisce a utenti diversi sono uguali (il che a volte accade se gli utenti e caricarli più volte nello stesso KMS). Abbiamo notato che non sostituiscono il metodo Java equals, perché questo richiederebbe eseguire l'override di hashCode e non è possibile implementare hashCode in un compatibile con equals senza fare ipotesi non comprovate.

Inoltre, richiediamo un metodo getParameters(). Ciò consente agli utenti di ottenere informazioni originali sui Parametri utilizzati per creare la chiave.

Infine, AesGcmKey utilizza un metodo getKeyBytes che restituisce il materiale della chiave non elaborata. Questi metodi sono molto tipici delle classi chiave: sono specifici per il tipo, e fornire accesso al materiale della chiave sottostante. Utilizzandoli, gli utenti possono, ad esempio, implementare la primitiva rappresentata dalla chiave, o serializzare la chiave per archiviarla su disco o inviarla tramite in ogni rete. La chiave stessa è responsabile della protezione del materiale della chiave accessi non autorizzati. Ad esempio, SecretBytes richiede un token di accesso per che forniscono il materiale (vedi Controllo dell'accesso).

Chiavi asimmetriche

Per le primitive asimmetriche, Tink utilizza due classi chiave, una per private e una per le delle chiavi pubbliche. Per i parametri, è più conveniente utilizzare lo stesso poiché esiste una sola classe che può essere utilizzata per generare le chiavi.

Tink ha anche un'interfaccia PrivateKey con l'interfaccia funzione getPublicKey().