実際には Tink には、各要素を表す Key
オブジェクトがあります。
Parameters
を表す keys オブジェクトと Parameters
オブジェクト。
たとえば、Java では AesGcmKey
オブジェクトを使用して、
AES GCM 鍵を表します。
このセクションでは、これらのオブジェクトが Java でどのように設計され、 やり取りできます。
Parameters
個のオブジェクト
広く使用されている AEAD 暗号化スキームである AES GCM について考えてみましょう。
Tink は、タスクの実行に必要な情報を提供する AesGcmParameters
オブジェクトを提供します。
AesGcmKey
を作成します。これについては後で説明します。
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
をオーバーライドします。また、安全なメソッドで hashCode
を実装する方法は
実証されていない仮定を行わずに equals
と互換性があります。
次に、メソッド getParameters()
が必要です。これによりユーザーは
キーの作成に使用されたパラメータに関する元の情報。
最後に、AesGcmKey
には未加工の鍵マテリアルを返すメソッド getKeyBytes
があります。
このようなメソッドは、キークラスによく見られます。型に固有で、
基になる鍵マテリアルへのアクセス権を付与します。ユーザーはこれらを使用して
原則として、たとえば、キーで表されるプリミティブを実装します。
ディスクに保存するか、Cloud Storage 経由で送信するために、
接続します鍵自体は、鍵マテリアルを攻撃から保護し、
防ぐことができます。たとえば、SecretBytes
には、以下を行うためのアクセス トークンが必要です。
実際に資料を提供し
(アクセス制御をご覧ください)。
非対称鍵
非対称プリミティブの場合、Tink は 2 つの鍵クラスを使用します。1 つは非公開用、もう 1 つは非公開用です。 あります。パラメータについては、同じものを使用すると、 (キーの生成に使用できるクラスは 1 つしかないため)。
Tink には、追加のインターフェース PrivateKey
もあります。
関数 getPublicKey()
を実行します。