Tink는 모든 프로그래밍 언어에서 '동일하게' 작동해야 합니다. 이 개념은 간단하지 않지만 가장 중요한 것은 다음과 같습니다.
일관성을 유지하기 위해 Tink는 교차 언어 GitHub 저장소에서 찾을 수 있는 교차 언어 테스트를 사용합니다. 이러한 테스트는 다양한 언어의 일관성과 상호 운용성을 확인합니다.
하지만 일관성을 정의하는 것은 생각만큼 간단하지 않습니다. 따라서 이 페이지에서는 Google의 실무 정의를 제공합니다. 기본적으로 Tink는 두 가지 유형의 일관성을 제공합니다.
- 평가 일관성: 지정된 키 세트1에 대해 두 언어로 프리미티브를 만드는 데 성공하면 동일하게 작동합니다.
- 생성 일관성: 지원되는 키 유형 목록에 설명된 대로 언어가 키 세트의 모든 키 유형을 지원하는 경우 언어로 프리미티브를 만들 수 있습니다.
컨텍스트
개략적으로 Tink는 다음과 같은 API를 제공합니다.
키 세트 조작: Tink는 키 세트에 새 키를 추가하고, 키 세트에서 키를 삭제하고, 키 세트의 기본 키를 변경하는 API를 제공합니다.
키 세트 직렬화: Tink는 키 세트를 바이트 시퀀스로 직렬화하고 반대로 바이트 시퀀스에서 키 세트를 파싱하는 API를 제공합니다.
기본 요소 생성: Tink는 키 세트에서 기본 요소의 인터페이스를 만드는 API를 제공합니다. 예를 들어 Java의 키 세트에서
Aead객체를 만들려면 사용자가keysetHandle.getPrimitive(config, Aead.class)를 호출합니다.기본 사용: 기본 생성 단계에서 생성된 인터페이스는 암호화 작업을 수행하는 API를 제공합니다.
이러한 API에 관해 물어봐야 할 중요한 질문이 두 가지 있습니다.
생성: 직렬화된 키 세트, 언어, 프리미티브가 주어지면 이 키 세트에서 해당 언어로 프리미티브를 만들 수 있나요?
평가: 지정된 키 세트에서 특정 언어로 프리미티브를 만들 수 있는 경우 프리미티브 객체는 어떻게 작동하나요?
Tink는 키 세트를 파싱할 때 일관성을 제공하지 않는다는 점에 유의해야 합니다. 예를 들어 Tink C++는
- CHACHA20-POLY1305 AEAD 작업이 Tink에서 구현되지 않더라도 CHACHA20-POLY1305 키가 포함된 키 세트를 성공적으로 파싱합니다.
- 길이가 1바이트인 키가 있는 키 세트를 성공적으로 파싱하며, 이는 모든 암호화 작업에서 실패합니다.
이러한 동작은 마이너 버전에서 변경될 수 있습니다.
평가 일관성
평가의 일관성은 생성 프로세스의 일관성보다 더 중요합니다. Java의 AEAD가 C++의 AEAD 암호화를 복호화할 수 없는 경우 사용자에게 심각한 문제가 발생합니다.
일반적으로 Tink는 기본 요소에 대해 명확한 방식으로 일관성을 유지하는 것을 목표로 합니다. 예를 들어 C++ 바이너리가 public_key_sign->Sign(data)로 서명을 계산하는 경우 상응하는 Java 인증 호출 publicKeyVerify.verify(signature, data)이 성공할 것으로 예상됩니다.
하지만 여기에도 몇 가지 주의사항이 있습니다. 예를 들어 Java에서 aead.Encrypt의 반환 유형은 byte[]입니다.
자바 언어 사양 (JLS) §10.7에 따라 배열의 길이는 int 유형이며, §JLS 4.2.1에 따라 최대 2147483647일 수 있습니다. 따라서 Java에서 길이가 2147483647인 배열의 암호화는 실패합니다. 암호화에는 약간의 오버헤드가 있으므로 출력이 너무 길어집니다. 그럼에도 불구하고 다른 언어에서는 이러한 입력에 대해 암호화가 허용됩니다.
따라서 Tink는 평가 일관성을 제공합니다. 지정된 키 세트의 경우 두 언어로 프리미티브를 만들면 동일하게 작동합니다.
예외적으로 일부 작업은 예외적인 상황에서 실패할 수 있습니다.
꾸준한 제작
모든 키 세트에 대해 프리미티브 생성이 항상 성공하는 것은 아닙니다. 예를 들어 Tink는 키 자료의 길이가 128비트인 경우 사용자가 AesSivKey를 만들 수 없습니다.
그럼에도 불구하고 Tink는 다음과 같은 일관성을 제공합니다. 두 언어가 모두 키 유형을 지원하는 경우 프리미티브를 만들 수 있는 키 집합이 일치합니다. 물론 언어가 키 유형을 지원하지 않으면 기본 객체를 만들 수 없습니다.
생성 일관성은 평가 일관성보다 덜 중요하며, 이 규칙에는 평가 일관성보다 더 많은 예외가 있습니다. 이러한 제한사항은 지원되는 키 유형 목록에 설명되어 있습니다. 예를 들어 키 유형 ECIES의 경우 Tink는 키 계약에 사용할 타원 곡선을 선택할 수 있지만 Java는 X25519를 지원하지 않습니다. 따라서 Java에서 X25519를 사용한 키 생성이 실패합니다.
-
이 문서에서는 대부분의 언어에서
KeysetHandle라고 하는 객체를 나타내기 위해Keyset라는 용어를 사용합니다. ↩