sgcCrypto에는 선택적인 컴파일 타임 스위치인 SGC_CRYPTO_FIPS가 있으며, 이 스위치는 라이브러리에 FIPS 승인 알고리즘만 남깁니다. 이는 FIPS 및 NIST SP 간행물에 포함되지 않은 알고리즘을 사용해서는 안 되는 프로젝트를 위한 것입니다. 이 페이지에서는 스위치가 하는 일, 켜는 방법, 유지되는 것, 제거되는 것, 그리고 스위치가 다루지 않는 범위를 설명합니다.
여기서 말하는 FIPS의 의미
FIPS 140-3은 알고리즘이 아니라 암호 모듈에 대한 인증입니다. 공인 시험 기관이 NIST의 암호 모듈 검증 프로그램(CMVP)에 따라 한 제품의 특정 빌드 하나를 시험하고, NIST가 그 빌드에 대한 인증서를 발행합니다. AES와 같은 승인 알고리즘을 사용한다고 해서 프로그램이 검증을 받은 것이 되지는 않습니다.
sgcCrypto는 FIPS 140-3 검증을 받은 모듈이 아니며, 스위치를 켜는 것이 검증을 받았다는 주장이 되지도 않습니다. 스위치가 실제로 하는 일은 그보다 범위가 좁습니다:
유지되는 알고리즘은 아래 표에 나열된 FIPS 및 NIST SP 간행물을 따릅니다.
프로젝트에 공식적인 FIPS 140-3 요구 사항이 있다면, 그 암호화 처리는 검증된 모듈을 거쳐야 합니다. 예를 들어 시스템을 FIPS 모드로 실행하는 Windows CNG가 그러한 모듈입니다. 이 스위치는 승인되지 않은 알고리즘이 코드에 들어오지 않도록 하는 데 도움이 될 뿐, 검증된 모듈을 대체하지는 않습니다.
켜는 방법
스위치는 기본적으로 꺼져 있습니다. 스위치를 켜지 않으면 아무것도 바뀌지 않으며, 암호화 페이지에 나열된 모든 알고리즘을 사용할 수 있습니다. 스위치를 켜려면 다음 중 하나를 수행하십시오:
{.$DEFINE SGC_CRYPTO_FIPS} { off, the default }
{$DEFINE SGC_CRYPTO_FIPS} { on }
그런 다음 다시 빌드하십시오. 스위치는 이 정의와 함께 컴파일된 코드에만 적용되므로, 이 정의 없이 빌드된 사전 컴파일 패키지는 영향을 받지 않습니다.
스위치를 켜면 제거된 함수는 더 이상 존재하지 않습니다. 그중 하나를 여전히 호출하는 코드는 "Undeclared identifier" 오류와 함께 컴파일에 실패합니다. 이는 의도된 동작입니다: 승인되지 않은 것은 실수로라도 바이너리에 포함될 수 없으며, 다른 알고리즘이 필요한 모든 위치를 컴파일러가 알려 줍니다.
유지되는 것
인증서, 일회용 비밀번호, 인코딩 도우미도 함께 유지됩니다. 이들은 승인 알고리즘만으로 만들어졌거나, 애초에 암호화 알고리즘이 아니기 때문입니다.
| 계열 | 유지되는 항목 | 표준 |
| AES | ECB, CBC, CFB, OFB, CTR, CTS, GCM, CCM 모드의 AES-128/192/256, AES Key Wrap (KW 및 KWP), AES-CMAC, AES-GMAC | FIPS 197, SP 800-38A/B/C/D/F |
| 해싱 | SHA-1 (여전히 허용되는 경우에만 사용하며, 새 서명에는 절대 사용하지 않음), SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224/256/384/512, SHAKE128, SHAKE256, cSHAKE, KMAC | FIPS 180-4, FIPS 202, SP 800-185 |
| 메시지 인증 | HMAC-SHA1, HMAC-SHA256, HMAC-SHA384, HMAC-SHA512 | FIPS 198-1 |
| 키 유도 | PBKDF2, HKDF, ANSI X9.63 KDF | SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (ANSI X9.63 KDF) |
| RSA | RSA 키 생성, PKCS#1 v1.5 및 PSS 서명, RSA-OAEP 암호화 | FIPS 186-5, SP 800-56B |
| ECDSA 및 ECDH | NIST P-256, P-384, P-521에서의 서명 및 키 합의 (P-224는 sgcCrypto에 구현되어 있지 않음) | FIPS 186-5, SP 800-56A |
| EdDSA | Ed25519 및 Ed448 서명 | FIPS 186-5 |
| 포스트 양자 암호화 | ML-KEM, ML-DSA, SLH-DSA | FIPS 203, FIPS 204, FIPS 205 |
| 인증서 및 PKI | X.509 인증서 파싱, 체인 검증 및 CRL 확인, 그리고 위 알고리즘으로 서명한 인증서 또는 CSR 생성 | RFC 5280, RFC 2986 |
| 일회용 비밀번호 | HMAC 기반의 HOTP 및 TOTP | RFC 4226, RFC 6238 |
| 인코딩 및 유틸리티 | Hex, Base32, Base64 인코딩, 상수 시간 비교, 보안 소거(secure zero) | RFC 4648 |
제거되는 것
| 제거되는 항목 | 이유 |
| ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305, XChaCha20-Poly1305 | NIST 알고리즘이 아닙니다. |
| X25519 및 X448 키 교환 | SP 800-56A에서 키 합의용으로 승인되지 않았습니다. |
| X25519 + ML-KEM-768 하이브리드 및 ECIES | 둘 다 X25519를 기반으로 합니다. |
| secp256k1 및 Brainpool 곡선, BIP-340 Schnorr 서명 | NIST 권장 곡선이 아니며, BIP-340은 FIPS 186-5 서명 방식이 아닙니다. FIPS 모드는 NIST P 곡선만 유지합니다. |
| Argon2 및 scrypt | NIST의 비밀번호 키 유도 함수가 아닙니다. |
| BLAKE2b, BLAKE2s, SipHash, TLSH | NIST 알고리즘이 아닙니다. |
| MD4, MD5, HMAC-MD5, RIPEMD-160, DES (sgcCrypto_Legacy 유닛) | 더 이상 쓰이지 않거나, NIST의 승인을 받은 적이 없습니다. |
| KDF1 및 KDF2 | NIST 간행물이 아니라 ISO 18033-2에 정의되어 있습니다. ANSI X9.63 KDF는 유지됩니다. |
| RSA PKCS#1 v1.5 암호화 | SP 800-131A에서 허용되지 않습니다. PKCS#1 v1.5 서명은 유지됩니다. |
| WinZip AES (AE-1 및 AE-2) | NIST 형식이 아닙니다. |
제거된 알고리즘 대부분은 첫 번째 표에 승인된 대체 알고리즘이 있습니다: ChaCha20-Poly1305 대신 AES-GCM, X25519 대신 P-256 또는 P-384에서의 ECDH, Argon2나 scrypt 대신 PBKDF2, BLAKE2 대신 SHA-256 또는 SHA-3, 그리고 PKCS#1 v1.5 암호화 대신 RSA-OAEP입니다.
런타임에 검사하는 규칙
일부 규칙은 함수에 전달되는 값에 따라 달라지므로 컴파일러가 강제할 수 없습니다. 스위치를 켜면 sgcCrypto는 함수가 실행될 때 이러한 규칙을 검사하며, 각 규칙은 메시지가 sgcCrypto FIPS:로 시작하는 예외를 일으킵니다:
난수 바이트의 출처
키, 논스, 솔트에는 난수 바이트가 필요합니다. sgcRandomBytes는 두 모드 모두에서 항상 운영 체제로부터 난수 바이트를 읽으며, 그 위에 자체 생성기를 덧붙여 실행하지 않습니다. 스위치는 어떤 시스템 소스를 사용할지만 바꿉니다:
| 플랫폼 | SGC_CRYPTO_FIPS 사용 시 | SGC_CRYPTO_FIPS 미사용 시 |
| Windows | BCryptGenRandom (CNG, 시스템 기본 RNG), 폴백 없음 | BCryptGenRandom, 그리고 BCryptGenRandom을 사용할 수 없으면 RtlGenRandom, 이어서 CryptGenRandom으로 폴백 |
| Linux 및 Android | getrandom 시스템 호출 | /dev/urandom |
| macOS 및 iOS | Security 프레임워크의 SecRandomCopyBytes | /dev/urandom |
두 모드 모두에서 어떤 소스도 읽을 수 없으면, 약한 바이트를 반환하는 대신 예외를 일으킵니다. 운영 체제의 생성기가 FIPS로 인정되는지는 sgcCrypto가 아니라 운영 체제와 그 구성에 따라 달라집니다.
스위치가 다루지 않는 범위
이 스위치는 sgcCrypto 유닛에만 적용됩니다. sgcWebSockets의 다른 부분은 여전히 승인되지 않은 알고리즘을 사용할 수 있습니다:
애플리케이션 전체가 승인된 알고리즘 안에서만 동작해야 한다면, 이러한 영역도 함께 검토하십시오.
관련 항목