Microsoft SDL Cryptographic Rekommendationer
Introduktion
Det här dokumentet innehåller rekommendationer och metodtips för att använda kryptering på Microsoft-plattformar. Mycket av innehållet här parafraseras eller aggregeras från Microsofts egna interna säkerhetsstandarder som används för att skapa livscykeln för säkerhetsutveckling. Det är tänkt att användas som referens när du utformar produkter för att använda samma API:er, algoritmer, protokoll och nyckellängder som Microsoft kräver av sina egna produkter och tjänster.
Utvecklare på icke-Windows-plattformar kan också dra nytta av dessa rekommendationer. Även om API- och biblioteksnamnen kan skilja sig åt är metodtipsen för algoritmval, nyckellängd och dataskydd likartade på olika plattformar.
Säkerhetsprotokoll, algoritm och nyckellängd Rekommendationer
SSL/TLS-versioner
Produkter och tjänster bör använda kryptografiskt säkra versioner av SSL/TLS:
TLS 1.2 ska vara aktiverat
TLS 1.1 och TLS 1.0 bör endast aktiveras för bakåtkompatibilitet
SSL 3 och SSL 2 ska inaktiveras som standard
Symmetriska block chiffer, chifferlägen och initieringsvektorer
Blockera chiffer
För produkter som använder symmetriska block chiffer:
Advanced Encryption Standard (AES) rekommenderas för ny kod.
Trenycklars trippel datakrypteringsstandard (3DES) är tillåten i befintlig kod för bakåtkompatibilitet.
Alla andra block chiffer, inklusive RC2, DES, 2-Key 3DES, DESX och Skipjack, bör endast användas för att dekryptera gamla data och bör ersättas om de används för kryptering.
För symmetriska blockkrypteringsalgoritmer rekommenderas en minsta nyckellängd på 128 bitar. Den enda blockkrypteringsalgoritm som rekommenderas för ny kod är AES (AES-128, AES-192 och AES-256 är alla acceptabla, och notera att AES-192 saknar optimering på vissa processorer). 3DES med tre nycklar är för närvarande acceptabelt om det redan används i befintlig kod. övergång till AES rekommenderas. DES, DESX, RC2 och Skipjack anses inte längre vara säkra. Dessa algoritmer bör endast användas för att dekryptera befintliga data för bakåtkompatibilitet och data ska krypteras igen med hjälp av ett rekommenderat blockkryptering.
Chifferlägen
Symmetriska algoritmer kan användas i en mängd olika lägen, varav de flesta länkar samman krypteringsåtgärderna på efterföljande block med klartext och chiffertext.
Symmetriska block chiffer ska användas med något av följande chifferlägen:
Chifferblocklänkning (CBC)
Chiffertextstöld (CTS)
Vissa andra chifferlägen som de som ingår nedan har implementeringsgropar som gör dem mer benägna att användas felaktigt. I synnerhet bör man undvika att använda den elektroniska kodboken (ECB). Om du återanvänder samma initieringsvektor (IV) med block chiffer i "strömmande chifferlägen" som CTR kan krypterade data avslöjas. Ytterligare säkerhetsgranskning rekommenderas om något av nedanstående lägen används:
Feedback om utdata (OFB)
Chifferfeedback (CFB)
Räknare (CTR)
Räknare med CBC-MAC (CCM)
Galois/Counter Mode (GCM)
Allt annat som inte finns med i listan "rekommenderas" ovan
Initieringsvektorer (IV)
Alla symmetriska block chiffer bör också användas med ett kryptografiskt starkt slumpmässigt tal som initieringsvektor. Initieringsvektorer bör aldrig vara ett konstant värde. Se Slumptalsgeneratorer för rekommendationer om hur du genererar kryptografiskt starka slumpmässiga tal.
Initieringsvektorer bör aldrig återanvändas när du utför flera krypteringsåtgärder, eftersom detta kan avslöja information om de data som krypteras, särskilt när du använder strömmande chifferlägen som Utdatafeedback (OFB) eller räknare (CTR).
Asymmetriska algoritmer, nyckellängder och utfyllnadslägen
RSA
RSA bör användas för kryptering, nyckelutbyte och signaturer.
RSA-kryptering bör använda utfyllnadslägena OAEP eller RSA-PSS. Befintlig kod bör endast använda PKCS #1 v1.5-utfyllnadsläge för kompatibilitet.
Användning av null-utfyllnad rekommenderas inte.
Nycklar >= 2 048 bitar rekommenderas
ECDSA
ECDSA med >= 256 bitars nycklar rekommenderas
ECDSA-baserade signaturer bör använda en av de tre NIST-godkända kurvorna (P-256, P-384 eller P521).
ECDH
ECDH med >= 256 bitars nycklar rekommenderas
ECDH-baserat nyckelutbyte bör använda en av de tre NIST-godkända kurvorna (P-256, P-384 eller P521).
Integer Diffie-Hellman
Nyckellängd >= 2 048 bitar rekommenderas
Gruppparametrarna ska antingen vara en välkänd namngiven grupp (t.ex. RFC 7919) eller genereras av en betrodd part och autentiseras före användning
Nyckellivslängder
Alla asymmetriska nycklar bör ha en maximal livslängd på fem år, vilket rekommenderas för ett års livslängd.
Alla symmetriska nycklar bör ha en livslängd på högst tre år. rekommenderade livslängden på ett år.
Du bör ange en mekanism eller ha en process för att ersätta nycklar för att uppnå den begränsade aktiva livslängden. Efter slutet av sin aktiva livslängd bör en nyckel inte användas för att skapa nya data (till exempel för kryptering eller signering), men kan fortfarande användas för att läsa data (till exempel för dekryptering eller verifiering).
Slumptalsgeneratorer
Alla produkter och tjänster bör använda kryptografiskt säkra slumptalsgeneratorer när slumpmässighet krävs.
CNG
- Använda BCryptGenRandom med flaggan BCRYPT_USE_SYSTEM_PREFERRED_RNG
CAPI
- Använd CryptGenRandom för att generera slumpmässiga värden.
Win32/64
Äldre kod kan använda RtlGenRandom i kernelläge
Ny kod ska använda BCryptGenRandom eller CryptGenRandom.
C-funktionen Rand_s() rekommenderas också (som i Windows anropar CryptGenRandom)
Rand_s() är en säker och högpresterande ersättning för Rand(). Rand() bör inte användas för kryptografiska program, men är endast ok för intern testning.
Funktionen SystemPrng rekommenderas för kernel-lägeskod.
.NET
- Använda RNGCryptoServiceProvider
Windows Store-appar
- Store Apps kan använda CryptographicBuffer.GenerateRandom eller CryptographicBuffer.GenerateRandomNumber.
Rekommenderas inte
Osäkra funktioner som rör slumptalsgenerering inkluderar rand,System.Random (.NET), GetTickCount och GetTickCount64
Användning av slumptalsgeneratorn med dubbla elliptiska kurvor ("DUAL_EC_DRBG") rekommenderas inte.
Kryptobibliotek som stöds av Windows Platform
På Windows-plattformen rekommenderar Microsoft att du använder de krypto-API:er som är inbyggda i operativsystemet. På andra plattformar kan utvecklare välja att utvärdera kryptobibliotek som inte är plattformsbaserade för användning. I allmänhet uppdateras plattformskrypteringsbibliotek oftare eftersom de levereras som en del av ett operativsystem i stället för att paketeras med ett program.
Alla användningsbeslut om plattform eller icke-plattformskryptering bör vägledas av följande krav:
Biblioteket ska vara en aktuell version som stöds utan kända säkerhetsrisker
De senaste säkerhetsprotokollen, algoritmerna och nyckellängderna bör stödjas
(Valfritt) Biblioteket ska endast kunna stödja äldre säkerhetsprotokoll/algoritmer för bakåtkompatibilitet
Intern kod
Kryptopri primitiver: Om din version finns i Windows eller Windows Telefon använder du CNG om möjligt. Annars använder du CryptoAPI (kallas även CAPI, som stöds som en äldre komponent i Windows från Windows Vista och framåt).
SSL/TLS/DTLS: WinINet, WinHTTP, Schannel, IXMLHTTPRequest2 eller IXMLHTTPRequest3.
- WinHTTP-appar bör skapas med WinHttpSetOptionför att stödja TLS 1.2
Verifiering av kodsignatur: WinVerifyTrust är det API som stöds för att verifiera kodsignaturer på Windows-plattformar.
Certifikatverifiering (som används i begränsad certifikatverifiering för kodsignering eller SSL/TLS/DTLS): CAPI2 API; Till exempel CertGetCertificateChain och CertVerifyCertificateChainPolicy
Hanterad kod
Kryptopri primitiver: Använd API:et som definierats i System.Security.Cryptography-namnrymd--- CNG-klasserna är att föredra.
Använd den senaste versionen av .Net Framework. Detta bör minst vara .Net Framework version 4.6. Om en äldre version krävs kontrollerar du att regkey "SchUseStrongCrypto" är inställd på att aktivera TLS 1.2 för programmet i fråga.
Certifikatverifiering: Använd API:er som definierats under namnområdet System.Security.Cryptography.X509Certificates.
SSL/TLS/DTLS: Använd API:er som definierats under namnområdet System.Net (till exempel HttpWebRequest).
Nyckelhärledningsfunktioner
Nyckelhärledning är processen att härleda kryptografiskt nyckelmaterial från en delad hemlighet eller en befintlig kryptografisk nyckel. Produkter bör använda rekommenderade nyckelhärledningsfunktioner. Att härleda nycklar från användarvalda lösenord eller hash-lösenord för lagring i ett autentiseringssystem är ett specialfall som inte omfattas av den här vägledningen. bör utvecklare kontakta en expert.
Följande standarder anger de KDF-funktioner som rekommenderas för användning:
NIST SP 800-108: Rekommendation för nyckelhärledning med pseudorandomfunktioner. I synnerhet KDF i räknarläge, med HMAC som pseudorandomfunktion
NIST SP 800-56A (revision 2): Rekommendation för parvisa nyckeletableringsscheman med diskret logaritmkryptografi. I synnerhet rekommenderas "Enstegsnyckelavledningsfunktion" i avsnitt 5.8.1.
Om du vill härleda nycklar från befintliga nycklar använder du API:et BCryptKeyDerivation med en av algoritmerna:
BCRYPT_SP800108_CTR_HMAC_ALGORITHM
BCRYPT_SP80056A_CONCAT_ALGORITHM
Om du vill härleda nycklar från en delad hemlighet (utdata från ett nyckelavtal) använder du API:et BCryptDeriveKey med någon av följande algoritmer:
BCRYPT_KDF_SP80056A_CONCAT
BCRYPT_KDF_HMAC
Certifikatverifiering
Produkter som använder SSL, TLS eller DTLS bör fullständigt verifiera X.509-certifikaten för de entiteter som de ansluter till. Detta omfattar verifiering av certifikaten":
Domännamn.
Giltighetsdatum (både start- och förfallodatum).
Återkallningsstatus.
Användning (till exempel "Serverautentisering" för servrar, "Klientautentisering" för klienter).
Förtroendekedja. Certifikat bör länkas till en rotcertifikatutfärdare (CA) som är betrodd av plattformen eller som uttryckligen konfigurerats av administratören.
Om något av dessa verifieringstester misslyckas bör produkten avsluta anslutningen till entiteten.
Klienter som litar på "självsignerade" certifikat (till exempel en e-postklient som ansluter till en Exchange-server i en standardkonfiguration) kan ignorera verifieringskontroller av certifikat. Självsignerade certifikat förmedlar dock inte förtroende, supportåterkallelse eller stöd för nyckelförnyelse. Du bör bara lita på självsignerade certifikat om du har hämtat dem från en annan betrodd källa (till exempel en betrodd entitet som tillhandahåller certifikatet via en autentiserad och integritetsskyddad transport).
Kryptografiska hashfunktioner
Produkter bör använda SHA-2-serien med hashalgoritmer (SHA256, SHA384 och SHA512). Trunkering av kryptografiska hashar i säkerhetssyfte till mindre än 128 bitar rekommenderas inte.
MAC/HMAC/nyckelade hash-algoritmer
En kod för meddelandeautentisering (MAC) är en information som är kopplad till ett meddelande som gör att mottagaren kan verifiera både avsändarens äkthet och meddelandets integritet med hjälp av en hemlig nyckel.
Användning av antingen en hash-baserad MAC (HMAC) eller block-chifferbaserad MAC rekommenderas så länge alla underliggande hash- eller symmetriska krypteringsalgoritmer också rekommenderas för användning. För närvarande omfattar detta funktionerna HMAC-SHA2 (HMAC-SHA256, HMAC-SHA384 och HMAC-SHA512).
Trunkering av HMACs till mindre än 128 bitar rekommenderas inte.
Design och driftsöverväganden
Du bör tillhandahålla en mekanism för att ersätta kryptografiska nycklar efter behov. Nycklar bör ersättas när de har nått slutet av sin aktiva livslängd eller om den kryptografiska nyckeln har komprometterats. När du förnyar ett certifikat bör du förnya det med en ny nyckel.
Produkter som använder kryptografiska algoritmer för att skydda data bör innehålla tillräckligt med metadata tillsammans med innehållet för att stödja migrering till olika algoritmer i framtiden. Detta bör omfatta den algoritm som används, nyckelstorlekar, initieringsvektorer och utfyllnadslägen.
- Mer information om kryptografisk flexibilitet finns i Kryptografisk flexibilitet på MSDN.
När det är tillgängligt bör produkterna använda etablerade kryptografiska protokoll som tillhandahålls av plattformen i stället för att implementera dem på nytt. Detta omfattar signeringsformat (t.ex. använd ett standardformat, befintligt format).
Symmetriska ström chiffer som RC4 bör inte användas. I stället för symmetriska ström chiffer bör produkter använda ett block chiffer, särskilt AES med en nyckellängd på minst 128 bitar.
Rapportera inte kryptografiska åtgärdsfel till slutanvändare. När du returnerar ett fel till en fjärruppringare (t.ex. webbklient eller klient i ett klientserverscenario) använder du endast ett allmänt felmeddelande.
- Undvik att ange onödig information, till exempel att direkt rapportera fel med out-of-range eller ogiltig längd. Logga utförliga fel endast på servern och endast om utförlig loggning är aktiverad.
Ytterligare säkerhetsgranskning rekommenderas starkt för alla design som innehåller följande:
Ett nytt protokoll som främst fokuserar på säkerhet (till exempel ett autentiserings- eller auktoriseringsprotokoll)
Ett nytt protokoll som använder kryptografi i ett nytt eller icke-standardiserat sätt o Exempel på överväganden är:
Kommer en produkt som implementerar protokollet att anropa krypto-API:er eller -metoder som en del av protokollimplementeringen?
Är protokollet beroende av något annat protokoll som används för autentisering eller auktorisering?
Kommer protokollet att definiera lagringsformat för kryptografiska element, till exempel nycklar?
Självsignerade certifikat rekommenderas inte för produktionsmiljöer. Användning av ett självsignerat certifikat, till exempel användning av en rå kryptografisk nyckel, ger inte användare eller administratörer någon grund för att fatta ett förtroendebeslut.
- Användningen av ett certifikat som är rotat i en betrodd certifikatutfärdare tydliggör däremot grunden för att förlita sig på den associerade privata nyckeln och aktiverar återkallande och uppdateringar i händelse av ett säkerhetsfel.
Kryptera känsliga data före lagring
DPAPI/DPAPI-NG
För data som måste sparas mellan systemomstarter:
CryptProtectData
CryptUnprotectData
NCryptProtectSecret (Windows 8 CNG DPAPI)
För data som inte behöver sparas mellan systemomstarter:
CryptProtectMemory
CryptUnprotectMemory
För data som måste sparas och nås av flera domänkonton och datorer:
NCryptProtectSecret (i CNG DPAPI, tillgängligt från och med Windows 8)
SQL Server TDE
Du kan använda SQL Server transparent datakryptering (TDE) för att skydda känsliga data.
Du bör använda en krypteringsnyckel för TDE-databas (DEK) som uppfyller kraven på SDL-kryptografialgoritm och nyckelstyrka. För närvarande rekommenderas endast AES_128, AES_192 och AES_256. TRIPLE_DES_3KEY rekommenderas inte.
Det finns några viktiga saker att tänka på när du använder SQL TDE:
SQL Server stöder inte kryptering för FILESTREAM-data , även när TDE är aktiverat.
TDE tillhandahåller inte automatiskt kryptering för data som överförs till eller från databasen. Du bör också aktivera krypterade anslutningar till SQL Server-databasen. Mer information om hur du aktiverar krypterade anslutningar finns i Aktiverakrypterade Anslut ions till databasmotorn (Konfigurationshanteraren för SQL Server).
Om du flyttar en TDE-skyddad databas till en annan SQL Server-instans bör du också flytta certifikatet som skyddar TDE-datakrypteringsnyckeln (DEK) och installera den i huvuddatabasen för SQL Server-målinstansen. Mer information finns i TechNet-artikeln Flytta en TDE-skyddaddatabas till en annan SQL Server.
Hantering av autentiseringsuppgifter
Använd Windows Credential Manager-API:et eller Microsoft Azure KeyVault för att skydda lösenords- och autentiseringsuppgifter.
Windows Store-appar
Använd klasserna i namnrymderna Windows.Security.Cryptography och Windows.Security.Cryptography.DataProtection för att skydda hemligheter och känsliga data.
ProtectAsync
ProtectStreamAsync
Ta bort skyddSynkronisering
Ta bort skyddetStreamAsync
Använd klasserna i namnområdet Windows.Security.Credentials för att skydda lösenords- och autentiseringsuppgifter.
.NET
För data som måste sparas mellan systemomstarter:
ProtectedData.Protect
ProtectedData.Unprotect
För data som inte behöver sparas mellan systemomstarter:
ProtectedMemory.Protect
ProtectedMemory.Unprotect
För konfigurationsfiler använder du
antingen RSAProtectedConfigurationProvider eller DPAPIProtectedConfigurationProvider för att skydda din konfiguration med hjälp av antingen RSA-kryptering eller DPAPI.
RSAProtectedConfigurationProvider kan användas på flera datorer i ett kluster. Mer information finns i Kryptera konfigurationsinformation med skyddad konfiguration.