키 및 매개변수 객체

실제로 Tink는 를 나타내는 Key 객체와 Parameters를 나타내는 Parameters 객체를 제공합니다. 예를 들어 자바에는 AES GCM 키를 나타내는 AesGcmKey 객체가 있습니다.

이 섹션에서는 이러한 객체를 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 객체에는 이 Parameters 객체에서 만든 키에 이러한 필수 ID가 있는지 여부를 지정하는 hasIdRequirement 메서드가 있습니다.

다음으로 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에 여러 번 업로드하는 경우 가끔 이러한 상황이 발생함). 자바 메서드 equals는 재정의하지 않습니다. hashCode를 재정의해야 하기 때문입니다. 또한 입증되지 않은 가정을 하지 않고 equals와 호환되는 안전한 방식으로 hashCode를 구현할 방법이 없습니다.

다음으로 getParameters() 메서드가 필요합니다. 이렇게 하면 사용자가 키를 만드는 데 사용된 매개변수에 관한 원래 정보를 가져올 수 있습니다.

마지막으로 AesGcmKey에는 원시 키 자료를 반환하는 getKeyBytes 메서드가 있습니다. 이러한 메서드는 키 클래스에서 매우 일반적입니다. 유형에 따라 다르며 기본 키 자료에 대한 액세스를 제공합니다. 이를 통해 사용자는 원칙적으로 키로 표시되는 프리미티브를 구현하거나, 키를 직렬화하여 디스크에 저장하거나 네트워크를 통해 전송할 수 있습니다. 키 자체는 승인되지 않은 액세스로부터 키 자료를 보호하는 역할을 합니다. 예를 들어 SecretBytes는 자료를 실제로 제공하려면 액세스 토큰이 필요합니다(액세스 제어 참조).

비대칭 키

비대칭 프리미티브의 경우 Tink는 두 개의 키 클래스(비공개용 1개와 공개 키용 1개)를 사용합니다. 매개변수의 경우 동일한 클래스를 사용하는 것이 더 편리합니다 (키 생성에 사용할 수 있는 클래스가 하나뿐이기 때문).

또한 Tink에는 추가 함수 getPublicKey()가 있는 PrivateKey 인터페이스가 있습니다.