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