実際には、Tink にはキーを表す Key
オブジェクトと、Parameters
を表す Parameters
オブジェクトが用意されています。たとえば、Java には、AES GCM 鍵を表す AesGcmKey
オブジェクトがあります。
このセクションでは、これらのオブジェクトが Java でどのように設計され、相互作用するかについて説明します。
Parameters
個のオブジェクト
広く使用されている AEAD 暗号化スキームである AES GCM を検討してください。Tink は、AesGcmKey
の作成に必要な情報を含む AesGcmParameters
オブジェクトを提供します。これについては後で説明します。Java のパラメータ階層は次のようになります。
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() {...}
}
鍵セット、暗号テキストのタグ付けのセクションで説明したように、一部の鍵は鍵セット内にある場合、ID に要件があります。すべての Parameters
オブジェクトにはメソッド hasIdRequirement
があり、この Parameters
オブジェクトによって作成された鍵にそのような必須の ID があるかどうかを指定します。
次に、AesGcmParameters
オブジェクトはメソッド getKeySizeBytes()
、getIvSizeBytes()
、getTagSizeBytes()
を提供します。使用されている鍵の長さ、使用された IV の長さ、生成されたタグの長さがバイト単位で返されます。Tink には、完全性を期すためにこれらの関数の一部が用意されていますが、すべての選択肢に Aead
を作成できない場合もあります。たとえば、AES GCM では現在 12 バイトの IV のみがサポートされています。
AesGcmParameters
オブジェクトは、以前に定義したメソッド(および Java 標準メソッドの equals
および hashCode
)のオーバーライドも提供します。これらはおすすめの方法です。
最後に、新しい AeadParameters
オブジェクトを作成するための静的メソッドを提供します。これらは入力を検証します。つまり、サイズが 16、24、32 のいずれかであることを確認します。
キーオブジェクト
Tink にも鍵の階層があります。AES GCM の例が続く場合は、次のようになります。
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);
}
getIdRequirementOrNull
メソッドは、このキーに必要な ID を返します。要件がない場合は null
を返します。(この鍵に関する要件は、Tink が暗号テキストまたは署名の前に文字列 0x01<id>
を付加する場合があるためです。暗号テキストのタグ付けのセクションをご覧ください)。
これは常に getParameters().hasIdRequirement()
の結果と一致しており、新しい鍵クラスの実装者はこれを確保する必要があります。
Key
の実装では、異なるキーを比較するメソッド equalsKey
も用意する必要があります。多くの場合、このようなメソッドは有用です。たとえば、鍵導出をテストする場合、導出を繰り返し適用した場合に同じ鍵オブジェクトが生成されるようにする必要があります。また、KMS が異なるユーザーに提供する鍵が同一であるかどうかを確認する場合があります(これは、ユーザーが鍵を共有し、同じ KMS に複数回アップロードした場合に発生することがあります)。注目すべきは、Java メソッド equals
をオーバーライドしないということです。これは、hashCode
をオーバーライドする必要があるためです。また、実証されていない仮定なしに、equals
と互換性のある安全な方法で hashCode
を実装することはできません。
次に、getParameters()
メソッドが必要です。これにより、ユーザーは鍵の作成に使用されたパラメータに関する元の情報を取得できます。
最後に、AesGcmKey
には未加工の鍵マテリアルを返すメソッド getKeyBytes
があります。このようなメソッドは鍵クラスでは非常に一般的で、型に固有で、基となる鍵マテリアルへのアクセスを提供します。これらを使用すると、原則として、鍵で表されるプリミティブを実装する、鍵をシリアル化してディスクへの保存やネットワーク経由での送信などを行うことができます。鍵自体は、不正アクセスから鍵マテリアルを保護する役割を担います。たとえば、SecretBytes
は実際にコンテンツを提供するため、アクセス トークンを必要とします(アクセス制御をご覧ください)。
非対称鍵
非対称プリミティブの場合、Tink は 2 つの鍵クラス(秘密鍵用と公開鍵用)を使用します。パラメータの場合は、同じクラスを使用する(キーの生成に使用できるクラスが 1 つしかないため)便利です。
Tink には、追加の関数 getPublicKey()
を持つインターフェース PrivateKey
もあります。