디지털 서명

디지털 서명 프리미티브를 사용하면 데이터가 조작되지 않았는지 확인할 수 있습니다. 서명된 데이터의 신뢰성과 무결성을 제공하지만 보안 비밀성은 제공하지 않습니다. 비대칭 키를 사용하므로 키 쌍 (공개 키와 비공개 키)을 사용합니다.

디지털 서명 프리미티브에는 다음과 같은 속성이 있습니다.

  • 진위성: 비공개 키가 없으면 PublicKeyVerify.Verify(signature, message)에서 검증하는 서명을 만들 수 없습니다.
  • 비대칭: 서명을 만드는 데 사용되는 키가 서명을 확인하는 데 사용되는 키와 다릅니다. 이를 통해 서명을 직접 만들 수 없는 당사자에게 서명을 확인하는 공개 키를 배포할 수 있습니다.

비대칭이 필요하지 않은 경우 더 간단하고 효율적인 MAC 기본 요소를 대신 사용하는 것이 좋습니다.

디지털 서명의 기능은 Tink에서 다음과 같은 기본 요소 쌍으로 표현됩니다.

  • 데이터 서명을 위한 PublicKeySign
  • 서명 확인을 위한 PublicKeyVerify

키 유형 선택

대부분의 사용 사례에는 ML_DSA_65 또는 ECDSA_P256을 사용하는 것이 좋지만 다양한 옵션이 있습니다. 일반적으로 다음이 적용됩니다.

  • ML-DSA-65는 양자 내성입니다. Google에서는 적극적으로 이 기능을 구현하고 있으며, 이제 사용 가능한 프로그래밍 언어에 이 기능을 사용하는 것이 권장됩니다.

다음과 같은 비 양자 알고리즘의 경우 가까운 시일 내에 키 유형을 변경해야 할 수 있습니다.

  • ECDSA_P256은 가장 널리 사용되는 옵션이며 적절한 기본값입니다. 하지만 ECDSA 서명은 변경 가능합니다.
  • ED25519는 결정적 서명을 생성하고 ECDSA_P256보다 나은 성능을 제공합니다.
  • RSA_SSA_PKCS1_3072_SHA256_F4는 결정적 서명을 생성하고 최고의 확인 성능을 제공합니다 (하지만 서명은 ECDSA_P256 또는 ED25519보다 훨씬 느림).

최소 보안 보장

  • 서명할 데이터는 임의의 길이를 가질 수 있습니다.
  • 타원 곡선 기반 스킴의 적응형 선택 메시지 공격에 대한 128비트 보안 수준
  • RSA 기반 스킴의 적응형 선택 메시지 공격에 대한 112비트 보안 수준 (2048비트 키 허용)

유연성

공격자가 이미 서명된 메시지에 대해 유효한 다른 서명을 만들 수 있는 경우 서명 스키마는 변경 가능합니다. 대부분의 시나리오에서는 문제가 되지 않지만, 프로그래머가 유효한 서명이 고유하다고 암시적으로 가정하는 경우도 있으며 이로 인해 예상치 못한 결과가 발생할 수 있습니다.

사용 사례

데이터에 디지털 서명하고 싶습니다를 참고하세요.