實際上,Tink 提供 Key
物件來代表
代表 Parameters
的 key 和 Parameters
物件。
例如在 Java 中,有 AesGcmKey
物件
代表 AES GCM 金鑰。
本節將說明這些物件在 Java 中的設計方式,以及這些物件的方法 互動。
Parameters
個物件
建議使用 AES GCM,這個廣為使用的 AEAD 加密機制。
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
可傳回原始金鑰內容。
對鍵類別而言,這類方法非常常見:這些方法專用於型別、
並提供基礎金鑰內容的存取權使用這些功能時
任何原則上都沒問題實作索引鍵所代表的
或者將金鑰序列化,以便儲存在磁碟中或透過
更是如此金鑰本身負責防止金鑰內容
未經授權存取。舉例來說,SecretBytes
需要存取權杖才能
實際上要提供這些內容
(請參閱存取權控管)。
非對稱金鑰
如為非對稱基元,Tink 會使用兩個 Key 類別,一個用於 private 類別,另一個則使用一個金鑰類別 公開金鑰參數中只要 類別 (因為只有一個類別可用來產生金鑰)。
Tink 也具有 PrivateKey
介面,其中包含
函式 getPublicKey()
。