sgcCrypto ma opcjonalny przełącznik kompilacji, SGC_CRYPTO_FIPS, który pozostawia w bibliotece wyłącznie algorytmy zatwierdzone przez FIPS. Jest przeznaczony dla projektów, które nie mogą używać algorytmów spoza publikacji FIPS i NIST SP. Ta strona wyjaśnia, co robi ten przełącznik, jak go włączyć, co zachowuje, co usuwa i czego nie obejmuje.
Co oznacza tutaj FIPS
FIPS 140-3 to certyfikacja modułu kryptograficznego, a nie algorytmu. Akredytowane laboratorium testuje jedną konkretną kompilację produktu w ramach prowadzonego przez NIST programu Cryptographic Module Validation Program (CMVP), a NIST publikuje certyfikat dla tej kompilacji. Użycie zatwierdzonego algorytmu, takiego jak AES, nie sprawia, że program staje się zwalidowany.
sgcCrypto nie jest modułem zwalidowanym zgodnie z FIPS 140-3, a włączenie przełącznika nie stanowi deklaracji walidacji. Zakres działania przełącznika jest węższy:
Algorytmy, które pozostają, są zaimplementowane zgodnie z publikacjami FIPS i NIST SP wymienionymi w poniższej tabeli.
Jeśli Twój projekt ma formalny wymóg FIPS 140-3, jego kryptografia musi przechodzić przez zwalidowany moduł, na przykład Windows CNG, gdy system działa w trybie FIPS. Przełącznik pomaga utrzymać niezatwierdzone algorytmy poza Twoim kodem. Nie zastępuje zwalidowanego modułu.
Włączanie przełącznika
Przełącznik jest domyślnie wyłączony. Bez niego nic się nie zmienia i dostępny jest każdy algorytm wymieniony na stronie Kryptografia. Aby go włączyć, wykonaj jedną z poniższych czynności:
{.$DEFINE SGC_CRYPTO_FIPS} { off, the default }
{$DEFINE SGC_CRYPTO_FIPS} { on }
Następnie przebuduj projekt. Przełącznik wpływa wyłącznie na kod skompilowany z tą dyrektywą, więc nie dotyczy prekompilowanych pakietów zbudowanych bez niej.
Po włączeniu przełącznika usunięte funkcje przestają istnieć. Kod, który nadal wywołuje którąś z nich, nie kompiluje się, a kompilator zgłasza błąd „Undeclared identifier”. Jest to zamierzone: nic niezatwierdzonego nie może przypadkiem trafić do pliku binarnego, a kompilator wskazuje każde miejsce, które wymaga innego algorytmu.
Co pozostaje
Certyfikaty, hasła jednorazowe i funkcje pomocnicze do kodowania również pozostają, ponieważ są zbudowane wyłącznie z zatwierdzonych algorytmów albo w ogóle nie są algorytmami kryptograficznymi.
| Rodzina | Zachowane | Standard |
| AES | AES-128/192/256 w trybach ECB, CBC, CFB, OFB, CTR, CTS, GCM i CCM, AES Key Wrap (KW i KWP), AES-CMAC oraz AES-GMAC | FIPS 197, SP 800-38A/B/C/D/F |
| Haszowanie | SHA-1 (tylko tam, gdzie jest nadal dozwolony, nigdy do nowych podpisów), SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224/256/384/512, SHAKE128, SHAKE256, cSHAKE i KMAC | FIPS 180-4, FIPS 202, SP 800-185 |
| Uwierzytelnianie wiadomości | HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 i HMAC-SHA512 | FIPS 198-1 |
| Wyprowadzanie kluczy | PBKDF2, HKDF oraz ANSI X9.63 KDF | SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (ANSI X9.63 KDF) |
| RSA | Generowanie kluczy RSA, podpisy PKCS#1 v1.5 i PSS, szyfrowanie RSA-OAEP | FIPS 186-5, SP 800-56B |
| ECDSA i ECDH | Podpisy i uzgadnianie klucza na NIST P-256, P-384 i P-521 (krzywa P-224 nie jest zaimplementowana w sgcCrypto) | FIPS 186-5, SP 800-56A |
| EdDSA | Podpisy Ed25519 i Ed448 | FIPS 186-5 |
| Kryptografia postkwantowa | ML-KEM, ML-DSA i SLH-DSA | FIPS 203, FIPS 204, FIPS 205 |
| Certyfikaty i PKI | Parsowanie certyfikatów X.509, weryfikacja łańcucha i sprawdzanie CRL, a także generowanie certyfikatów lub żądań CSR podpisanych powyższymi algorytmami | RFC 5280, RFC 2986 |
| Hasła jednorazowe | HOTP i TOTP, zbudowane na HMAC | RFC 4226, RFC 6238 |
| Kodowanie i narzędzia | Kodowanie Hex, Base32 i Base64, porównanie w stałym czasie, bezpieczne zerowanie | RFC 4648 |
Co zostaje usunięte
| Usunięte | Powód |
| ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305 i XChaCha20-Poly1305 | Nie są algorytmami NIST. |
| Wymiana kluczy X25519 i X448 | Nie są zatwierdzone do uzgadniania klucza w SP 800-56A. |
| Hybryda X25519 + ML-KEM-768 oraz ECIES | Oba mechanizmy są zbudowane na X25519. |
| secp256k1 i krzywe Brainpool oraz podpisy Schnorra BIP-340 | Nie są krzywymi zalecanymi przez NIST, a BIP-340 nie jest schematem podpisu z FIPS 186-5. Tryb FIPS zachowuje wyłącznie krzywe NIST P. |
| Argon2 i scrypt | Nie są funkcjami NIST do wyprowadzania kluczy z haseł. |
| BLAKE2b, BLAKE2s, SipHash i TLSH | Nie są algorytmami NIST. |
| MD4, MD5, HMAC-MD5, RIPEMD-160 i DES (jednostka sgcCrypto_Legacy) | Przestarzałe albo nigdy niezatwierdzone przez NIST. |
| KDF1 i KDF2 | Zdefiniowane w ISO 18033-2, a nie w publikacji NIST. ANSI X9.63 KDF pozostaje. |
| Szyfrowanie RSA PKCS#1 v1.5 | Niedozwolone przez SP 800-131A. Podpisy PKCS#1 v1.5 pozostają. |
| WinZip AES (AE-1 i AE-2) | Nie jest formatem NIST. |
Dla większości usuniętych algorytmów zatwierdzony zamiennik znajduje się w pierwszej tabeli: AES-GCM zamiast ChaCha20-Poly1305, ECDH na P-256 lub P-384 zamiast X25519, PBKDF2 zamiast Argon2 lub scrypt, SHA-256 lub SHA-3 zamiast BLAKE2 oraz RSA-OAEP zamiast szyfrowania PKCS#1 v1.5.
Reguły sprawdzane w czasie działania
Niektóre reguły zależą od wartości przekazanych do funkcji, więc kompilator nie może ich wymusić. Po włączeniu przełącznika sgcCrypto sprawdza je podczas wykonywania funkcji, a każda z nich zgłasza wyjątek, którego komunikat zaczyna się od sgcCrypto FIPS:
Skąd pochodzą losowe bajty
Klucze, nonce i sole wymagają losowych bajtów. sgcRandomBytes w obu trybach zawsze odczytuje je z systemu operacyjnego i nigdy nie nakłada na nie własnego generatora. Przełącznik zmienia jedynie to, które źródło systemowe jest używane:
| Platforma | Z SGC_CRYPTO_FIPS | Bez SGC_CRYPTO_FIPS |
| Windows | BCryptGenRandom (CNG, preferowany systemowy RNG), bez mechanizmu awaryjnego | BCryptGenRandom, z przejściem awaryjnym na RtlGenRandom, a następnie na CryptGenRandom, gdy BCryptGenRandom nie jest dostępny |
| Linux i Android | Wywołanie systemowe getrandom | /dev/urandom |
| macOS i iOS | SecRandomCopyBytes z frameworka Security | /dev/urandom |
W obu trybach, jeśli nie da się odczytać żadnego źródła, zgłaszany jest wyjątek zamiast zwracania słabych bajtów. To, czy generator systemu operacyjnego jest uznawany za zgodny z FIPS, zależy od systemu operacyjnego i jego konfiguracji, a nie od sgcCrypto.
Czego przełącznik nie obejmuje
Przełącznik dotyczy wyłącznie jednostek sgcCrypto. Inne części sgcWebSockets nadal mogą używać niezatwierdzonych algorytmów:
Jeśli cała aplikacja musi ograniczać się do zatwierdzonych algorytmów, przejrzyj również te obszary.
Zobacz także