디지털 서명

디지털 서명 원시 함수를 사용하면 아무도 데이터를 조작하지 않았는지 확인할 수 있습니다. 서명된 데이터의 신뢰성과 무결성은 보장하지만 보안 비밀성은 보장하지 않습니다. 비대칭이므로 키 쌍 (공개 키 및 비공개 키)을 사용합니다.

디지털 서명 원시에는 다음과 같은 속성이 있습니다.

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

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

디지털 서명의 기능은 Tink에서 다음과 같은 프리미티브 쌍으로 표현됩니다.

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

키 유형 선택

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

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

최소 보안 보장

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

가공성

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

사용 사례

데이터에 디지털 서명을 하고 싶습니다.