Cryptografische aanbevelingen voor Microsoft SDL
Gebruik deze informatie als referentie bij het ontwerpen van producten om dezelfde API's, algoritmen, protocollen en sleutellengten te gebruiken die Microsoft nodig heeft voor eigen producten en services. Veel van de inhoud is gebaseerd op de eigen interne beveiligingsstandaarden van Microsoft die worden gebruikt om de levenscyclus voor beveiligingsontwikkeling te maken.
Ontwikkelaars op niet-Windows-platforms kunnen profiteren van deze aanbevelingen. Hoewel de API- en bibliotheeknamen mogelijk verschillen, zijn de aanbevolen procedures met betrekking tot de keuze van het algoritme, de sleutellengte en de gegevensbescherming op verschillende platforms vergelijkbaar.
Aanbevelingen voor beveiligingsprotocol, algoritme en sleutellengte
TLS/SSL-versies
Producten en services moeten cryptografisch beveiligde versies van TLS/SSL gebruiken:
- TLS 1.3 moet zijn ingeschakeld.
- TLS 1.2 kan worden ingeschakeld om de compatibiliteit met oudere clients te verbeteren.
- TLS 1.1, TLS 1.0, SSL 3 en SSL 2 moeten zijn uitgeschakeld
Symmetrische blokcijfers, coderingsmodi en initialisatievectoren
Coderingen blokkeren
Voor producten die symmetrische blok-coderingen gebruiken:
- Advanced Encryption Standard (AES) wordt aanbevolen.
- Alle andere blokcoderingen, waaronder 3DES (Triple DES/TDEA), en RC4 moeten worden vervangen als ze worden gebruikt voor versleuteling.
Voor symmetrische blokversleutelingsalgoritmen is een minimale sleutellengte van 128 bits vereist, maar we raden u aan 256-bits sleutels te ondersteunen. Het enige blokversleutelingsalgoritmen dat wordt aanbevolen voor nieuwe code is AES (AES-128, AES-192 en AES-256 zijn allemaal acceptabel, omdat AES-192 geen optimalisatie op sommige processors heeft).
Coderingsmodi
Symmetrische algoritmen kunnen worden uitgevoerd in verschillende modi, waarvan de meeste de versleutelingsbewerkingen aan opeenvolgende blokken met tekst zonder opmaak en codering koppelen.
Symmetrische blok-coderingen moeten worden gebruikt met een van de volgende coderingsmodi:
- Cipher Block Chaining (CBC)
- Ciphertext Stealing (CTS)
- XEX-Based Tweaked-Codebook met XTS- (Ciphertext Stealing)
Sommige andere coderingsmodi, zoals die volgen, hebben valkuilen in de implementatie waardoor ze waarschijnlijker onjuist worden gebruikt. In het bijzonder moet de werkingsmodus van het Electronic Code Book (ECB) worden vermeden. Als u dezelfde initialisatievector (IV) hergebruikt met blokcoderingen in 'modi voor streaming-coderingen', zoals CTR, kunnen versleutelde gegevens worden onthuld. Extra beveiligingsbeoordeling wordt aanbevolen als een van de onderstaande modi wordt gebruikt:
- Uitvoerfeedback (OFB)
- Cijferfeedback (CFB)
- Teller (CTR)
- Alles wat niet op de voorgaande 'aanbevolen' lijst staat
Initialisatievectoren (IV)
Alle symmetrische blok-coderingen moeten ook worden gebruikt met een cryptografisch sterk willekeurig getal als initialisatievector. Initialisatievectors mogen nooit een constante of prediceerbare waarde zijn. Zie Generatoren voor willekeurige getallen voor aanbevelingen voor het genereren van cryptografische sterke willekeurige getallen.
Initialisatievectors mogen nooit opnieuw worden gebruikt bij het uitvoeren van meerdere versleutelingsbewerkingen. Hergebruik kan informatie onthullen over de gegevens die worden versleuteld, met name bij het gebruik van streaming-coderingsmodi zoals Uitvoerfeedback (OFB) of Teller (CTR).
AES-GCM & AES-CCM aanbevelingen
AES-GCM (Galois/tellermodus) en AES-CCM (Teller met CBC-MAC) worden veelgebruikte geverifieerde versleutelingsmodi gebruikt. Ze combineren vertrouwelijkheids- en integriteitsbescherming, waardoor ze nuttig zijn voor veilige communicatie. Hun fragiliteit ligt echter in niet-hergebruik. Wanneer dezelfde nonce (initialisatievector) tweemaal wordt gebruikt, kan dit leiden tot catastrofale gevolgen.
We raden u aan de nonce-richtlijnen te volgen, zoals beschreven in NIST SP 800-38D, aanbevelingen voor blokcoderingsmodi: Galois/tellermodus (GCM) en GMAC, met speciale aandacht voor sectie 8.3 met betrekking tot het maximaal aantal oproepen.
Een andere optie zou zijn het genereren van unieke AES-GCM/CCM-sleutels voor elke afzonderlijke versleuteling, waardoor het maximale aantal uitvoeringen wordt beperkt tot 1. Deze methode wordt aanbevolen voor het versleutelen van gegevens in rusttoestand, waarbij het gebruik van een teller of het bijhouden van het maximum aantal aanroepen voor een bepaalde sleutel niet praktisch is.
Voor het versleutelen van gegevens in ruste kunt u ook overwegen om AES-CBC te gebruiken met een berichtverificatiecode (MAC) als alternatief met behulp van een Encrypt-then-MAC-schema, zodat u ervoor zorgt dat u afzonderlijke sleutels gebruikt voor versleuteling en voor de MAC.
Integriteitsverificatie
Het is een veelvoorkomende misvatting dat versleuteling standaard zowel vertrouwelijkheid als integriteitsgarantie biedt. Veel versleutelingsalgoritmen bieden geen integriteitscontrole en zijn mogelijk kwetsbaar voor manipulatieaanvallen. Er moeten extra stappen worden ondernomen om de integriteit van gegevens te waarborgen voordat ze worden verzonden en na ontvangst.
Als u geen geverifieerd versleutelingsalgoritme kunt gebruiken met gekoppelde gegevens (AEAD), zoals AES-GCM, kunt u ook de integriteit valideren met een berichtverificatiecode (MAC) met behulp van een versleutelings- en MAC-schema, zodat u afzonderlijke sleutels gebruikt voor versleuteling en voor de MAC.
Het gebruik van een afzonderlijke sleutel voor versleuteling en voor de MAC is essentieel. Als het niet mogelijk is om de twee sleutels op te slaan, is een geldig alternatief om twee sleutels af te leiden van de hoofdsleutel met behulp van een geschikte functie voor sleutelafleiden (KDF), één voor versleutelingsdoeleinden en één voor MAC. Voor meer informatie, zie SP 800-108 Rev. 1, Aanbeveling voor Sleutelafleiding met behulp van pseudotoevalsgeneratoren | CSRC (nist.gov).
Asymmetrische algoritmen, sleutellengten en opvullingsmodi
RSA
- RSA kan worden gebruikt voor versleuteling, sleuteluitwisseling en handtekeningen.
- RSA-versleuteling moet gebruikmaken van de OAEP- of RSA-PSS opvullingsmodi.
- Bestaande code mag alleen de opvullingsmodus PKCS #1 v1.5 gebruiken voor compatibiliteit.
- Het gebruik van null-opvulling wordt niet aanbevolen.
- Minimaal een 2048-bits sleutellengte wordt aanbevolen, maar we raden u aan een 3072-bits sleutellengte te ondersteunen.
ECDSA en ECDH
- Op ECDH gebaseerde sleuteluitwisseling en op ECDSA gebaseerde handtekeningen moeten gebruikmaken van een van de drie NIST-goedgekeurde curven (P-256, P-384 of P521).
- Ondersteuning voor P-256 moet als minimum worden beschouwd, maar we raden u aan P-384 te ondersteunen.
Gehele Diffie-Hellman
- Sleutellengte >= 2048 bits wordt aanbevolen0
- De groepsparameters moeten een bekende benoemde groep zijn (bijvoorbeeld RFC 7919) of worden gegenereerd door een vertrouwde partij en geverifieerd voor gebruik.
Sleutellevensduur
- Definieer een cryptoperiod voor alle sleutels.
- Bijvoorbeeld: Een symmetrische sleutel voor gegevensversleuteling, ook wel gegevensversleutelingssleutel of DEK genoemd, kan een gebruiksperiode van maximaal twee jaar hebben voor het versleutelen van gegevens, ook wel bekend als de gebruiksperiode van de oorsprongsteller. U kunt definiëren dat het voor ontsleuteling een geldige gebruiksperiode heeft van drie jaar, ook wel bekend als de gebruiksperiode voor ontvangers.
- U moet een mechanisme opgeven of een proces hebben voor het vervangen van sleutels om de beperkte actieve levensduur te bereiken. Na het einde van de actieve levensduur mag een sleutel niet worden gebruikt om nieuwe gegevens te produceren (bijvoorbeeld voor versleuteling of ondertekening), maar kan nog steeds worden gebruikt om gegevens te lezen (bijvoorbeeld voor ontsleuteling of verificatie).
Generatoren voor willekeurige getallen
Alle producten en services moeten cryptografisch veilige generatoren voor willekeurige getallen gebruiken wanneer willekeurigheid vereist is.
CNG
- Gebruik BCryptGenRandom met vlag BCRYPT_USE_SYSTEM_PREFERRED_RNG.
Win32/64
- Verouderde code kan RtlGenRandom- gebruiken in de kernelmodus.
- Nieuwe code moet BCryptGenRandom- of CryptGenRandomgebruiken.
- De C-functie Rand_s() wordt ook aanbevolen (die in Windows CryptGenRandomaanroept).
- Rand_s() is een veilige en goed presterende vervanging voor Rand().
- Rand() mag niet worden gebruikt voor cryptografische toepassingen.
.NET
- Gebruik RandomNumberGenerator.
PowerShell
- Gebruik Get-SecureRandom (PowerShell).
Windows Store-apps
- Windows Store-apps kunnen CryptographicBuffer.GenerateRandom of CryptographicBuffer.GenerateRandomNumbergebruiken.
Linux/macOS
- Het
/dev/urandom
-apparaat biedt een cryptografisch sterke bron van willekeurige gegevens, net zoals degetrandom(2)
systeemoproep.
Niet aanbevolen
- Onveilige functies met betrekking tot het genereren van willekeurige getallen zijn onder andere: rand, System.Random (.NET), GetTickCount, GetTickCount64en Get-Random (PowerShell-cmdlet).
- Het gebruik van het algoritme voor willekeurige getalgenerator met dubbele elliptische curven ('DUAL_EC_DRBG') is niet toegestaan.
Windows-platform ondersteunde cryptobibliotheken
Op het Windows-platform raadt Microsoft aan de crypto-API's te gebruiken die zijn ingebouwd in het besturingssysteem. Op andere platforms kunnen ontwikkelaars ervoor kiezen om cryptobibliotheken zonder platform te evalueren voor gebruik. Over het algemeen worden cryptobibliotheken van het platform vaker bijgewerkt omdat ze worden verzonden als onderdeel van een besturingssysteem in plaats van te worden gebundeld met een toepassing.
Elke gebruiksbeslissing met betrekking tot platform versus niet-platform crypto moet worden geleid door de volgende vereisten:
- De bibliotheek moet een ondersteunde versie zijn die vrij is van bekende veiligheidskwetsbaarheden.
- De meest recente beveiligingsprotocollen, algoritmen en sleutellengten moeten worden ondersteund.
- (Optioneel) De bibliotheek moet alleen oudere beveiligingsprotocollen/algoritmen kunnen ondersteunen voor compatibiliteit met eerdere versies.
Systeemeigen code
- Crypto Primitives: Als uw release zich in Windows bevindt, gebruikt u CNG, indien mogelijk.
- Verificatie van codehandtekening: WinVerifyTrust is de ondersteunde API voor het verifiëren van codehandtekeningen op Windows-platforms.
- Certificaatvalidatie (zoals gebruikt in beperkte certificaatvalidatie voor ondertekening van code of SSL/TLS/DTLS): CAPI2-API; bijvoorbeeld CertGetCertificateChain en CertVerifyCertificateChainPolicy.
Beheerde code (.NET)
- Crypto-primitieven: Gebruik de API die is gedefinieerd in System.Security.Cryptography naamruimte.
- Gebruik de nieuwste versie van .NET die beschikbaar is.
Belangrijke afleidingsfuncties
Sleutelontduivatie is het proces van het afleiden van cryptografisch sleutelmateriaal uit een gedeeld geheim of een bestaande cryptografische sleutel. Producten moeten aanbevolen belangrijke afleidingsfuncties gebruiken. Het afleiden van sleutels van door de gebruiker gekozen wachtwoorden of hash-wachtwoorden voor opslag in een verificatiesysteem is een speciaal geval dat niet wordt gedekt door deze richtlijnen; ontwikkelaars moeten een expert raadplegen.
De volgende standaarden geven KDF-functies op die worden aanbevolen voor gebruik:
- NIST SP 800-108 (Revisie 1): Aanbeveling voor sleutelafleiding door pseudowillekeurige functies. Met name de KDF in tegenmodus, met HMAC als een pseudowillekeurige functie
- NIST SP 800-56A (revisie 3): aanbeveling voor Pair-Wise sleuteluitwisselingsschema's met discrete logaritmecryptografie.
Als u sleutels wilt afleiden van bestaande sleutels, gebruikt u de BCryptKeyDerivation-API met een van de algoritmen:
- BCRYPT_SP800108_CTR_HMAC_ALGORITHM
- BCRYPT_SP80056A_CONCAT_ALGORITHM
Als u sleutels wilt afleiden van een gedeeld geheim (de uitvoer van een sleutelovereenkomst), gebruikt u de BCryptDeriveKey-API met een van de volgende algoritmen:
- BCRYPT_KDF_SP80056A_CONCAT
- BCRYPT_KDF_HMAC
Certificaatvalidatie
Producten die gebruikmaken van TLS of DTLS moeten de X.509-certificaten van de entiteiten waarmee ze verbinding maken, volledig verifiëren. Dit proces omvat verificatie van de volgende onderdelen van het certificaat:
- Domeinnaam.
- Geldigheidsdatums (zowel begin- als vervaldatums).
- Intrekkingsstatus.
- Gebruik (bijvoorbeeld 'Serververificatie' voor servers, 'Clientverificatie' voor clients).
- Vertrouwensketen. Certificaten moeten worden gekoppeld aan een basiscertificeringsinstantie (CA) die wordt vertrouwd door het platform of expliciet is geconfigureerd door de beheerder.
Als een van deze verificatietests mislukt, moet het product de verbinding met de entiteit beëindigen.
Gebruik geen zelfondertekende certificaten. Zelfondertekende certificaten wekken niet inherent vertrouwen, ondersteunen intrekking, of het vernieuwen van sleutels.
Cryptografische hashfuncties
Producten moeten gebruikmaken van de SHA-2-serie hash-algoritmen (SHA-256, SHA-384 en SHA-512). Het afkappen van cryptografische hashes voor beveiligingsdoeleinden tot minder dan 128 bits is niet toegestaan. Hoewel het gebruik van SHA-256 het minimum is, raden we u aan SHA-384 te ondersteunen.
MAC/HMAC/keyed hash-algoritmen
Een berichtverificatiecode (MAC) is een stukje informatie dat is gekoppeld aan een bericht waarmee de ontvanger zowel de echtheid van de afzender als de integriteit van het bericht kan verifiëren met behulp van een geheime sleutel.
Het gebruik van een op hash-gebaseerde MAC () of een op blokcodering-gebaseerde MAC () wordt aanbevolen, zolang alle onderliggende hash- of symmetrische versleutelingsalgoritmen ook worden aanbevolen voor gebruik; momenteel omvat dit de HMAC-SHA2-functies (HMAC-SHA256, HMAC-SHA384 en HMAC-SHA512). Hoewel het gebruik van HMAC-SHA256 het minimum is, raden we u aan HMAC-SHA384 te ondersteunen.
Afkapping van HMAC's tot minder dan 128 bits wordt niet aanbevolen.
Ontwerp- en operationele overwegingen
- U moet zo nodig een mechanisme opgeven voor het vervangen van cryptografische sleutels. Sleutels moeten worden vervangen zodra ze het einde van hun actieve levensduur hebben bereikt of als de cryptografische sleutel is aangetast.
- Wanneer u een certificaat verlengt, moet u het vernieuwen met een nieuwe sleutel.
- Producten die cryptografische algoritmen gebruiken om gegevens te beveiligen, moeten voldoende metagegevens bevatten, samen met die inhoud ter ondersteuning van migratie naar verschillende algoritmen in de toekomst. Deze metagegevens moeten het gebruikte algoritme, sleutelgrootten en opvullingsmodi bevatten.
- Zie het artikel Cryptografische flexibiliteitvoor meer informatie over cryptografische flexibiliteit.
- Waar beschikbaar moeten producten gebruikmaken van gevestigde, door het platform geleverde cryptografische protocollen in plaats van ze opnieuw te implementeren, inclusief ondertekeningsindelingen (bijvoorbeeld een standaard, bestaande indeling).
- Rapporteer geen cryptografische bewerkingsfouten aan eindgebruikers. Wanneer u een fout retourneert naar een externe beller (bijvoorbeeld een webclient of client in een clientserverscenario), gebruikt u alleen een algemeen foutbericht.
- Vermijd onnodige informatie, zoals het rechtstreeks rapporteren van fouten buiten het bereik of ongeldige lengtefouten. Alleen gedetailleerde fouten op de server vastleggen, en dat alleen doen als gedetailleerde logboekregistratie is ingeschakeld.
- Extra beveiligingsbeoordeling wordt ten zeerste aanbevolen voor elk ontwerp met de volgende items:
- Een nieuw protocol dat voornamelijk gericht is op beveiliging (zoals een verificatie- of autorisatieprotocol)
- Een nieuw protocol dat cryptografie op een nieuwe of niet-standaard manier gebruikt. Voorbeelden van overwegingen zijn:
- Worden er als onderdeel van de protocolimplementatie cryptografische API's of methoden aangeroepen door een product dat het protocol implementeert?
- Is het protocol afhankelijk van een ander protocol dat wordt gebruikt voor verificatie of autorisatie?
- Definieert het protocol opslagindelingen voor cryptografische elementen, zoals sleutels?
- Zelfondertekende certificaten worden niet aanbevolen. Het gebruik van een zelfondertekend certificaat, zoals het gebruik van een onbewerkte cryptografische sleutel, biedt gebruikers of beheerders geen basis voor het nemen van een vertrouwensbeslissing.
- Het gebruik van een certificaat dat is geroot in een vertrouwde certificeringsinstantie maakt daarentegen duidelijk de basis voor het vertrouwen op de bijbehorende persoonlijke sleutel en maakt intrekking en updates mogelijk als er sprake is van een beveiligingsfout.