金鑰與參數物件

實際上,Tink 提供 Key 物件來代表 代表 ParameterskeyParameters 物件。 例如在 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 標準方法 equalshashCode) 可視為最佳做法)。

最後,它提供用於建立新的 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,而且無法以安全的方式實作 hashCodeequals 相容,無需未經證實的假設。

接下來,我們需要使用 getParameters() 方法。這樣一來,使用者就能 用於建立鍵的參數相關原始資訊。

最後,AesGcmKey 的方法 getKeyBytes 可傳回原始金鑰內容。 對鍵類別而言,這類方法非常常見:這些方法專用於型別、 並提供基礎金鑰內容的存取權使用這些功能時 任何原則上都沒問題實作索引鍵所代表的 或者將金鑰序列化,以便儲存在磁碟中或透過 更是如此金鑰本身負責防止金鑰內容 未經授權存取。舉例來說,SecretBytes 需要存取權杖才能 實際上要提供這些內容 (請參閱存取權控管)。

非對稱金鑰

如為非對稱基元,Tink 會使用兩個 Key 類別,一個用於 private 類別,另一個則使用一個金鑰類別 公開金鑰參數中只要 類別 (因為只有一個類別可用來產生金鑰)。

Tink 也具有 PrivateKey 介面,其中包含 函式 getPublicKey()