Tink를 사용하여 FIPS 140-2 보안 요구사항 충족

Tink 자체는 FIPS 140-2 검증을 받지 않았습니다. 하지만 여러 FIPS 140-2 승인 알고리즘을 지원하며 기본 구현에서는 BoringSSLs BoringCrypto와 같은 검증된 암호화 모듈을 활용할 수 있습니다. Tink에는 FIPS 모드에서 BoringSSL을 빌드하기 위한 WORKSPACE가 포함되어 있습니다.

작업공간은 BoringSSL 사용이 FIPS를 준수한다는 것을 기본적으로 보장하지 않습니다. BoringCrypto의 공식 보안 정책을 읽는 것이 좋습니다.

지원되는 알고리즘

Tink의 다음 알고리즘은 FIPS 140-2에 따라 승인됩니다 (자세한 내용은 FIPS 140-2 부록 A 참고).

  • 인증된 암호화
    • AES-GCM
    • AES-CTR-HMAC-SHA256
  • MAC
    • HMAC-SHA256
    • AES-CMAC
  • 디지털 서명
    • ECDSA
    • RSA-SSA-PKCS1
    • RSA-SSA-PSS

C++의 FIPS 전용 모드

FIPS 140-2 승인 알고리즘과 검증된 구현을 사용해야 하는 경우 FIPS 전용 모드로 Tink를 빌드할 수 있습니다. 이렇게 하면 승인된 알고리즘으로만 사용이 제한되고 Tink가 검증된 암호화 모듈을 활용하고 있는지 확인합니다.

그러면 다음과 같은 방식으로 Tink의 동작이 변경됩니다.

  • Register() 함수는 FIPS 유효성 검사를 거친 구현이 있는 알고리즘만 등록합니다. 즉, 검증된 암호화 모듈을 사용하는 알고리즘에 키 세트를 사용할 수 있습니다.
  • Tink는 BoringSSL이 BoringCrypto 모듈로 빌드되었는지 확인합니다. 프리미티브를 호출하면 모듈을 사용할 수 없는 경우 INTERNAL 오류가 반환됩니다.
  • subtle/에서 프리미티브를 사용하는 것은 확인된 암호화 모듈을 활용하는 알고리즘으로 제한됩니다.

BoringCrypto

Tink는 C++에서 BoringCrypto를 사용하여 검증된 암호화 모듈에 대한 액세스를 제공합니다. 현재 유효성 검사 상태는 FIPS 전용 모드일 때 사용 가능한 알고리즘에 다음과 같은 추가 제약 조건을 적용합니다.

  • AES-CMAC는 검증되지 않았으며 사용할 수 없습니다.
  • RSA-SSA-PKCS1은 3072비트 모듈러스로 제한됩니다.
  • RSA-SSA-PSS는 3072비트 모듈러스로 제한됩니다.

Bazel과 함께 BoringCrypto 모듈을 사용하려면 C++ WORKSPACE에서 boringssllocal_repository 정의의 주석 처리를 삭제하면 됩니다.

컴파일 시간에 사용 설정

FIPS 전용 모드로 Tink를 빌드하려면 컴파일 시간에 플래그를 설정합니다.

bazel build ... --//third_party/tink/cc/config:use_only_fips=True

Tink가 FIPS 전용 모드로 빌드되었는지 런타임 시 확인하려면 상수 kUseOnlyFips를 제공하는 internal/fips_utils.h 헤더를 포함하면 됩니다.

FIPS 전용 모드로 Tink를 빌드하지 않는 경우에도 일부 알고리즘의 검증된 구현을 활용할 수 있지만 다른 알고리즘의 사용을 제한할 수는 없습니다.

런타임에 사용 설정

FIPS 전용 모드로 Tink를 빌드하는 대신 config/tink_fips.h에서 crypto::tink::RestrictToFips()을 호출하여 런타임에 플래그를 설정하여 FIPS 프리미티브에 대한 제한을 사용 설정할 수 있습니다.

경고: 런타임 옵션을 사용하는 경우 키 자료를 처리하거나 키 관리자를 등록하거나 다른 Tink 기능을 등록하기 전에 crypto::tink::RestrictToFips()를 호출해야 합니다. 또한 BoringSSL이 BoringCrypto 모듈로 빌드되었는지 확인해야 합니다. 그렇지 않으면 Tink에서 데이터 처리를 허용하지 않습니다.