FIPS-Modus

sgcCrypto verfügt über einen optionalen Schalter zur Kompilierzeit, SGC_CRYPTO_FIPS, der nur FIPS-zugelassene Algorithmen in der Bibliothek belässt. Er ist für Projekte gedacht, die keine Algorithmen außerhalb der Publikationen FIPS und NIST SP verwenden dürfen. Diese Seite erklärt, was der Schalter bewirkt, wie Sie ihn aktivieren, was er beibehält, was er entfernt und was er nicht abdeckt.

 

Was FIPS hier bedeutet

 

FIPS 140-3 ist die Zertifizierung eines kryptografischen Moduls, nicht eines Algorithmus. Ein akkreditiertes Labor testet einen bestimmten Build eines Produkts im Rahmen des Cryptographic Module Validation Program (CMVP) des NIST, und das NIST veröffentlicht ein Zertifikat für genau diesen Build. Allein dadurch, dass ein Programm einen zugelassenen Algorithmus wie AES verwendet, ist es noch nicht validiert.

 

sgcCrypto ist kein nach FIPS 140-3 validiertes Modul, und mit dem Aktivieren des Schalters wird keine Validierung behauptet. Was der Schalter tatsächlich bewirkt, ist enger gefasst:

Die verbleibenden Algorithmen folgen den in der Tabelle unten aufgeführten Publikationen FIPS und NIST SP.

 

Wenn für Ihr Projekt eine formale Anforderung nach FIPS 140-3 gilt, muss seine Kryptografie über ein validiertes Modul laufen, zum Beispiel Windows CNG auf einem System, das im FIPS-Modus betrieben wird. Der Schalter hilft, nicht zugelassene Algorithmen aus Ihrem Code herauszuhalten. Ein validiertes Modul ersetzt er nicht.

 

Den Schalter aktivieren

 

Der Schalter ist standardmäßig ausgeschaltet. Ohne ihn ändert sich nichts, und jeder auf der Seite Kryptografie aufgeführte Algorithmus ist verfügbar. Um ihn zu aktivieren, gehen Sie auf eine der folgenden Arten vor:

 


  {.$DEFINE SGC_CRYPTO_FIPS}   { off, the default }
  {$DEFINE SGC_CRYPTO_FIPS}    { on }

 

Erstellen Sie das Projekt anschließend neu. Der Schalter wirkt sich nur auf Code aus, der mit dieser Definition kompiliert wird, daher sind vorkompilierte Pakete, die ohne sie erstellt wurden, nicht betroffen.

 

Bei aktiviertem Schalter existieren die entfernten Funktionen nicht mehr. Code, der noch eine davon aufruft, lässt sich nicht kompilieren und meldet den Fehler „Undeclared identifier“. Das ist beabsichtigt: Nichts, was nicht zugelassen ist, kann versehentlich in die Binärdatei gelangen, und der Compiler zeigt auf jede Stelle, die einen anderen Algorithmus benötigt.

 

Was erhalten bleibt

 

Zertifikate, Einmalpasswörter und die Kodierungsfunktionen bleiben ebenfalls erhalten, weil sie ausschließlich aus den zugelassenen Algorithmen aufgebaut sind oder überhaupt keine kryptografischen Algorithmen sind.

 

Familie Beibehalten Standard
AES AES-128/192/256 in den Modi ECB, CBC, CFB, OFB, CTR, CTS, GCM und CCM, AES Key Wrap (KW und KWP), AES-CMAC und AES-GMAC FIPS 197, SP 800-38A/B/C/D/F
Hashing SHA-1 (nur wo noch zulässig, niemals für neue Signaturen), SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224/256/384/512, SHAKE128, SHAKE256, cSHAKE und KMAC FIPS 180-4, FIPS 202, SP 800-185
Nachrichtenauthentifizierung HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 und HMAC-SHA512 FIPS 198-1
Schlüsselableitung PBKDF2, HKDF und die ANSI X9.63 KDF SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (ANSI X9.63 KDF)
RSA RSA-Schlüsselerzeugung, Signaturen nach PKCS#1 v1.5 und PSS, RSA-OAEP-Verschlüsselung FIPS 186-5, SP 800-56B
ECDSA und ECDH Signaturen und Key Agreement auf NIST P-256, P-384 und P-521 (P-224 ist in sgcCrypto nicht implementiert) FIPS 186-5, SP 800-56A
EdDSA Signaturen mit Ed25519 und Ed448 FIPS 186-5
Post-Quanten-Kryptografie ML-KEM, ML-DSA und SLH-DSA FIPS 203, FIPS 204, FIPS 205
Zertifikate & PKI Parsen von X.509-Zertifikaten, Kettenverifikation und CRL-Prüfungen sowie Erzeugung von Zertifikaten oder CSRs, die mit den oben genannten Algorithmen signiert werden RFC 5280, RFC 2986
Einmalpasswörter HOTP und TOTP, aufgebaut auf HMAC RFC 4226, RFC 6238
Kodierung & Hilfsfunktionen Kodierung in Hex, Base32 und Base64, Vergleich in konstanter Zeit, sicheres Nullen RFC 4648

 

Was entfernt wird

 

Entfernt Grund
ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305 und XChaCha20-Poly1305 Keine NIST-Algorithmen.
Schlüsselaustausch mit X25519 und X448 Nach SP 800-56A nicht für Key Agreement zugelassen.
Die hybride Konstruktion X25519 + ML-KEM-768 sowie ECIES Beide basieren auf X25519.
secp256k1 und die Brainpool-Kurven sowie BIP-340-Schnorr-Signaturen Keine von NIST empfohlenen Kurven, und BIP-340 ist kein Signaturverfahren nach FIPS 186-5. Der FIPS-Modus behält nur die NIST-P-Kurven bei.
Argon2 und scrypt Keine Funktionen des NIST zur Schlüsselableitung aus Passwörtern.
BLAKE2b, BLAKE2s, SipHash und TLSH Keine NIST-Algorithmen.
MD4, MD5, HMAC-MD5, RIPEMD-160 und DES (die Unit sgcCrypto_Legacy) Veraltet oder vom NIST nie zugelassen.
KDF1 und KDF2 In ISO 18033-2 definiert, nicht in einer NIST-Publikation. Die ANSI X9.63 KDF bleibt erhalten.
RSA-Verschlüsselung nach PKCS#1 v1.5 Nach SP 800-131A nicht zulässig. Signaturen nach PKCS#1 v1.5 bleiben erhalten.
WinZip AES (AE-1 und AE-2) Kein NIST-Format.

 

Für die meisten entfernten Algorithmen steht in der ersten Tabelle ein zugelassener Ersatz: AES-GCM statt ChaCha20-Poly1305, ECDH auf P-256 oder P-384 statt X25519, PBKDF2 statt Argon2 oder scrypt, SHA-256 oder SHA-3 statt BLAKE2, und RSA-OAEP statt Verschlüsselung nach PKCS#1 v1.5.

 

Zur Laufzeit geprüfte Regeln

 

Einige Regeln hängen von den Werten ab, die an eine Funktion übergeben werden, daher kann der Compiler sie nicht durchsetzen. Bei aktiviertem Schalter prüft sgcCrypto sie, wenn die Funktion ausgeführt wird, und jede davon löst eine Exception aus, deren Meldung mit sgcCrypto FIPS: beginnt.

 

Woher die Zufallsbytes stammen

 

Schlüssel, Nonces und Salts benötigen Zufallsbytes. sgcRandomBytes liest sie in beiden Modi immer vom Betriebssystem und legt nie einen eigenen Generator darüber. Der Schalter ändert nur, welche Quelle des Systems verwendet wird:

 

Plattform Mit SGC_CRYPTO_FIPS Ohne SGC_CRYPTO_FIPS
Windows BCryptGenRandom (CNG, vom System bevorzugter RNG), ohne Rückfalllösung BCryptGenRandom, mit Rückfall auf RtlGenRandom und danach CryptGenRandom, wenn BCryptGenRandom nicht verfügbar ist
Linux und Android Der Systemaufruf getrandom /dev/urandom
macOS und iOS SecRandomCopyBytes aus dem Security-Framework /dev/urandom

 

Wenn keine Quelle gelesen werden kann, wird in beiden Modi eine Exception ausgelöst, statt schwache Bytes zurückzugeben. Ob der Generator des Betriebssystems als FIPS-konform gilt, hängt vom Betriebssystem und dessen Konfiguration ab, nicht von sgcCrypto.

 

Was der Schalter nicht abdeckt

 

Der Schalter gilt nur für die sgcCrypto-Units. Andere Teile von sgcWebSockets können weiterhin nicht zugelassene Algorithmen verwenden:

Wenn die gesamte Anwendung auf zugelassene Algorithmen beschränkt bleiben muss, prüfen Sie auch diese Bereiche.

 

Siehe auch