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