Tryb FIPS

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