실제로 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 표준 메서드 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에 여러 번 업로드하는 경우 가끔 이러한 상황이 발생함). 자바 메서드 equals
는 재정의하지 않습니다. hashCode
를 재정의해야 하기 때문입니다. 또한 입증되지 않은 가정을 하지 않고 equals
와 호환되는 안전한 방식으로 hashCode
를 구현할 방법이 없습니다.
다음으로 getParameters()
메서드가 필요합니다. 이렇게 하면 사용자가 키를 만드는 데 사용된 매개변수에 관한 원래 정보를 가져올 수 있습니다.
마지막으로 AesGcmKey
에는 원시 키 자료를 반환하는 getKeyBytes
메서드가 있습니다.
이러한 메서드는 키 클래스에서 매우 일반적입니다. 유형에 따라 다르며 기본 키 자료에 대한 액세스를 제공합니다. 이를 통해 사용자는 원칙적으로 키로 표시되는 프리미티브를 구현하거나, 키를 직렬화하여 디스크에 저장하거나 네트워크를 통해 전송할 수 있습니다. 키 자체는 승인되지 않은 액세스로부터 키 자료를 보호하는 역할을 합니다. 예를 들어 SecretBytes
는 자료를 실제로 제공하려면 액세스 토큰이 필요합니다(액세스 제어 참조).
비대칭 키
비대칭 프리미티브의 경우 Tink는 두 개의 키 클래스(비공개용 1개와 공개 키용 1개)를 사용합니다. 매개변수의 경우 동일한 클래스를 사용하는 것이 더 편리합니다 (키 생성에 사용할 수 있는 클래스가 하나뿐이기 때문).
또한 Tink에는 추가 함수 getPublicKey()
가 있는 PrivateKey
인터페이스가 있습니다.