Dela via


Översikt över kryptering, digitala signaturer och hash-algoritmer i .NET

Den här artikeln innehåller en översikt över krypteringsmetoder och metoder som stöds av .NET, inklusive ClickOnce-manifesten.

Introduktion till kryptografi

Offentliga nätverk som Internet tillhandahåller inte någon säker kommunikation mellan entiteter. Kommunikation via sådana nätverk kan läsas eller till och med ändras av obehöriga tredje parter. Kryptografi hjälper till att skydda data från att visas, ger sätt att identifiera om data har ändrats och hjälper till att tillhandahålla ett säkert kommunikationsmedel över annars osäkra kanaler. Data kan till exempel krypteras med hjälp av en kryptografisk algoritm som överförs i ett krypterat tillstånd och senare dekrypteras av den avsedda parten. Om en tredje part fångar upp krypterade data blir det svårt att dechiffrera.

I .NET hanterar klasserna i System.Security.Cryptography namnområdet många detaljer om kryptografi åt dig. Vissa är omslutningar för operativsystemimplementeringar, medan andra är helt hanterade implementeringar. Du behöver inte vara expert på kryptografi för att använda dessa klasser. När du skapar en ny instans av en av krypteringsalgoritmklasserna genereras nycklar automatiskt för enkel användning och standardegenskaperna är så säkra som möjligt.

Kryptografiska primitiver

I en typisk situation där kryptografi används kommunicerar två parter (Alice och Bob) via en icke-säkerhetskanal. Alice och Bob vill se till att deras kommunikation förblir obegriplig av alla som kanske lyssnar. Dessutom, eftersom Alice och Bob finns på avlägsna platser, måste Alice se till att den information hon får från Bob inte har ändrats av någon under överföringen. Dessutom måste hon se till att informationen verkligen kommer från Bob och inte från någon som utger sig för att vara Bob.

Kryptografi används för att uppnå följande mål:

  • Konfidentialitet: För att skydda en användares identitet eller data från att läsas.

  • Dataintegritet: För att skydda data från att ändras.

  • Autentisering: För att säkerställa att data kommer från en viss part.

  • Icke-avvisning: För att förhindra att en viss part nekar att de har skickat ett meddelande.

För att uppnå dessa mål kan du använda en kombination av algoritmer och metoder som kallas kryptografiska primitiver för att skapa ett kryptografiskt schema. I följande tabell visas kryptografiska primitiver och deras användning.

Kryptografisk primitiv Använd
Kryptering med hemlig nyckel (symmetrisk kryptografi) Utför en transformering av data för att förhindra att de läss av tredje part. Den här typen av kryptering använder en enda delad hemlig nyckel för att kryptera och dekryptera data.
Kryptering med offentlig nyckel (asymmetrisk kryptografi) Utför en transformering av data för att förhindra att de läss av tredje part. Den här typen av kryptering använder ett offentligt/privat nyckelpar för att kryptera och dekryptera data.
Kryptografisk signering Hjälper till att kontrollera att data kommer från en viss part genom att skapa en digital signatur som är unik för den parten. Den här processen använder även hash-funktioner.
Kryptografiska hashar Kartor data från valfri längd till en bytesekvens med fast längd. Hashar är statistiskt unika. en annan tvåbytessekvens kommer inte att hash till samma värde.

Kryptering med hemlig nyckel

Krypteringsalgoritmer med hemliga nycklar använder en enda hemlig nyckel för att kryptera och dekryptera data. Du måste skydda nyckeln från åtkomst av obehöriga agenter, eftersom alla parter som har nyckeln kan använda den för att dekryptera dina data eller kryptera sina egna data och hävda att de kommer från dig.

Kryptering med hemlig nyckel kallas även symmetrisk kryptering eftersom samma nyckel används för kryptering och dekryptering. Krypteringsalgoritmer med hemliga nycklar är mycket snabba (jämfört med algoritmer med offentlig nyckel) och passar bra för att utföra kryptografiska omvandlingar på stora dataströmmar. Asymmetriska krypteringsalgoritmer som RSA är matematiskt begränsade i hur mycket data de kan kryptera. Symmetriska krypteringsalgoritmer har vanligtvis inte dessa problem.

En typ av algoritm för hemlig nyckel som kallas blockkryptering används för att kryptera ett datablock i taget. Blockera chiffer som Data Encryption Standard (DES), TripleDES och Advanced Encryption Standard (AES) kryptografiskt omvandlar ett indatablock med n byte till ett utdatablock med krypterade byte. Om du vill kryptera eller dekryptera en sekvens med byte måste du göra det block för block. Eftersom n är litet (8 byte för DES och TripleDES; 16 byte [standard], 24 byte eller 32 byte för AES), måste datavärden som är större än n krypteras ett block i taget. Datavärden som är mindre än n måste expanderas till n för att kunna bearbetas.

En enkel form av block chiffer kallas elektronisk kodbok (ECB) läge. ECB-läget anses inte vara säkert eftersom det inte använder någon initieringsvektor för att initiera det första klartextblocket. För en viss hemlig nyckel k krypterar ett enkelt blockkryptering som inte använder en initieringsvektor samma indatablock i klartext till samma utdatablock i chiffertexten. Om du har duplicerade block i indataströmmen i klartext har du duplicerade block i chiffertextströmmen för utdata. Dessa duplicerade utdata blockerar avisering av obehöriga användare till den svaga krypteringen använde de algoritmer som kan ha använts och möjliga angreppslägen. ECB:s chifferläge är därför ganska sårbart för analys, och i slutändan nyckelidentifiering.

De block chifferklasser som finns i basklassbiblioteket använder ett standardlänkningsläge som kallas chifferblockslänkning (CBC), även om du kan ändra den här standardinställningen om du vill.

CBC-chiffer övervinner de problem som är kopplade till ECB-chiffer genom att använda en initieringsvektor (IV) för att kryptera det första blocket med klartext. Varje efterföljande block med klartext genomgår en bitvis exklusiv OR-åtgärd (XOR) med det tidigare chiffertextblocket innan det krypteras. Varje chiffertextblock är därför beroende av alla tidigare block. När det här systemet används kan vanliga meddelandehuvuden som kan vara kända för en obehörig användare inte användas för att bakåtkompileras en nyckel.

Ett sätt att kompromettera data som krypteras med ett CBC-chiffer är att utföra en fullständig sökning av alla möjliga nycklar. Beroende på storleken på nyckeln som används för att utföra kryptering är den här typen av sökning mycket tidskrävande med även de snabbaste datorerna och är därför ogenomförbar. Större nyckelstorlekar är svårare att dechiffrera. Även om kryptering inte gör det teoretiskt omöjligt för en angripare att hämta krypterade data, ökar det kostnaden för att göra detta. Om det tar tre månader att utföra en fullständig sökning för att hämta data som bara är meningsfulla i några dagar är den fullständiga sökmetoden opraktisk.

Nackdelen med kryptering med hemliga nycklar är att det förutsätter att två parter har kommit överens om en nyckel och IV och förmedlat sina värderingar. IV anses inte vara en hemlighet och kan överföras i klartext med meddelandet. Nyckeln måste dock hållas hemlig för obehöriga användare. På grund av dessa problem används kryptering med hemliga nycklar ofta tillsammans med kryptering med offentlig nyckel för att privat kommunicera värdena för nyckeln och IV.

Förutsatt att Alice och Bob är två parter som vill kommunicera via en icke-säkerhetskanal kan de använda kryptering med hemliga nycklar enligt följande: Alice och Bob samtycker till att använda en viss algoritm (till exempel AES) med en viss nyckel och IV. Alice skriver ett meddelande och skapar en nätverksström (kanske en namngiven pipe eller nätverks-e-post) som meddelandet ska skickas till. Därefter krypterar hon texten med hjälp av nyckeln och IV och skickar det krypterade meddelandet och IV till Bob över intranätet. Bob tar emot den krypterade texten och dekrypterar den med hjälp av IV och har tidigare kommit överens om nyckeln. Om överföringen fångas upp kan inte interceptorn återställa det ursprungliga meddelandet eftersom de inte känner till nyckeln. I det här scenariot måste bara nyckeln förbli hemlig. I ett verkligt scenario genererar antingen Alice eller Bob en hemlig nyckel och använder kryptering med offentlig nyckel (asymmetrisk) för att överföra den hemliga (symmetriska) nyckeln till den andra parten. Mer information om kryptering med offentliga nycklar finns i nästa avsnitt.

.NET tillhandahåller följande klasser som implementerar krypteringsalgoritmer med hemliga nycklar:

  • Aes

  • HMACSHA256, HMACSHA384 och HMACSHA512. (Det här är tekniskt hemliga nyckelalgoritmer eftersom de representerar autentiseringskoder för meddelanden som beräknas med hjälp av en kryptografisk hashfunktion i kombination med en hemlig nyckel. Se Hash-värden senare i den här artikeln.)

Kryptering med offentlig nyckel

Kryptering med offentlig nyckel använder en privat nyckel som måste hållas hemlig för obehöriga användare och en offentlig nyckel som kan offentliggöras för vem som helst. Den offentliga nyckeln och den privata nyckeln är matematiskt länkade. data som krypteras med den offentliga nyckeln kan endast dekrypteras med den privata nyckeln, och data som är signerade med den privata nyckeln kan endast verifieras med den offentliga nyckeln. Den offentliga nyckeln kan göras tillgänglig för vem som helst. den används för att kryptera data som ska skickas till den privata nyckelns innehavare. Krypteringsalgoritmer med offentlig nyckel kallas även asymmetriska algoritmer eftersom en nyckel krävs för att kryptera data och en annan nyckel krävs för att dekryptera data. En grundläggande kryptografisk regel förbjuder återanvändning av nycklar och båda nycklarna ska vara unika för varje kommunikationssession. Men i praktiken är asymmetriska nycklar i allmänhet långlivade.

Två parter (Alice och Bob) kan använda kryptering med offentlig nyckel enligt följande: Först genererar Alice ett offentligt/privat nyckelpar. Om Bob vill skicka ett krypterat meddelande till Alice ber han henne om hennes offentliga nyckel. Alice skickar sin offentliga nyckel till Bob via ett icke-säkerhetsnätverk, och Bob använder den här nyckeln för att kryptera ett meddelande. Bob skickar det krypterade meddelandet till Alice, och hon dekrypterar det med hjälp av sin privata nyckel. Om Bob fick Alices nyckel över en icke-säkerhetskanal, till exempel ett offentligt nätverk, är Bob öppen för en man-in-the-middle-attack. Därför måste Bob verifiera med Alice att han har en korrekt kopia av hennes offentliga nyckel.

Under överföringen av Alice offentliga nyckel kan en obehörig agent fånga upp nyckeln. Dessutom kan samma agent fånga upp det krypterade meddelandet från Bob. Agenten kan dock inte dekryptera meddelandet med den offentliga nyckeln. Meddelandet kan endast dekrypteras med Alice privata nyckel, som inte har överförts. Alice använder inte sin privata nyckel för att kryptera ett svarsmeddelande till Bob, eftersom alla med den offentliga nyckeln kan dekryptera meddelandet. Om Alice vill skicka tillbaka ett meddelande till Bob ber hon Bob om hans offentliga nyckel och krypterar hennes meddelande med hjälp av den offentliga nyckeln. Bob dekrypterar sedan meddelandet med hjälp av sin associerade privata nyckel.

I det här scenariot använder Alice och Bob kryptering med offentlig nyckel (asymmetrisk) för att överföra en hemlig (symmetrisk) nyckel och använda kryptering med hemlig nyckel under resten av sessionen.

Följande lista innehåller jämförelser mellan krypteringsalgoritmer med offentlig nyckel och hemlig nyckel:

  • Krypteringsalgoritmer med offentlig nyckel använder en fast buffertstorlek, medan krypteringsalgoritmer med hemlig nyckel använder en buffert med variabel längd.

  • Algoritmer med offentlig nyckel kan inte användas för att länka samman data till strömmar som algoritmer med hemliga nycklar kan, eftersom endast små mängder data kan krypteras. Därför använder asymmetriska åtgärder inte samma strömningsmodell som symmetriska åtgärder.

  • Kryptering med offentlig nyckel har ett mycket större nyckelutrymme (intervall med möjliga värden för nyckeln) än kryptering med hemlig nyckel. Därför är kryptering med offentlig nyckel mindre känslig för omfattande attacker som provar alla möjliga nycklar.

  • Offentliga nycklar är enkla att distribuera eftersom de inte behöver skyddas, förutsatt att det finns något sätt att verifiera avsändarens identitet.

  • Vissa algoritmer med offentlig nyckel (till exempel RSA och DSA, men inte Diffie-Hellman) kan användas för att skapa digitala signaturer för att verifiera identiteten på avsändaren av data.

  • Algoritmer med offentlig nyckel är mycket långsamma jämfört med algoritmer med hemliga nycklar och är inte utformade för att kryptera stora mängder data. Algoritmer med offentlig nyckel är endast användbara för överföring av mycket små mängder data. Vanligtvis används kryptering med offentliga nycklar för att kryptera en nyckel och IV som ska användas av en algoritm för hemliga nycklar. När nyckeln och IV har överförts används kryptering med hemliga nycklar under resten av sessionen.

.NET tillhandahåller följande klasser som implementerar offentliga nyckelalgoritmer:

RSA tillåter både kryptering och signering, men DSA kan endast användas för signering. DSA är inte lika säkert som RSA och vi rekommenderar RSA. Diffie-Hellman kan endast användas för nyckelgenerering. I allmänhet är algoritmer för offentlig nyckel mer begränsade i sina användningsområden än algoritmer med privata nycklar.

Digitala signaturer

Algoritmer med offentlig nyckel kan också användas för att skapa digitala signaturer. Digitala signaturer autentiserar identiteten för en avsändare (om du litar på avsändarens offentliga nyckel) och skyddar dataintegriteten. Med hjälp av en offentlig nyckel som genereras av Alice kan mottagaren av Alices data verifiera att Alice skickade den genom att jämföra den digitala signaturen med Alices data och Alice offentliga nyckel.

Om du vill använda kryptering med offentlig nyckel för att signera ett meddelande digitalt använder Alice först en hash-algoritm för meddelandet för att skapa en meddelandesammandrag. Meddelandesammandraget är en kompakt och unik representation av data. Alice krypterar sedan meddelandet med sin privata nyckel för att skapa sin personliga signatur. När bob får meddelandet och signaturen dekrypterar han signaturen med hjälp av Alice offentliga nyckel för att återställa meddelandets sammandrag och hashar meddelandet med samma hashalgoritm som Alice använde. Om meddelandet sammanfattas som Bob beräknar exakt matchar meddelandet som tagits emot från Alice, är Bob säker på att meddelandet kom från den privata nyckelns ägare och att data inte har ändrats. Om Bob litar på att Alice är ägare till den privata nyckeln vet han att meddelandet kom från Alice.

Kommentar

En signatur kan verifieras av vem som helst eftersom avsändarens offentliga nyckel är allmänt känd och vanligtvis ingår i formatet för digital signatur. Den här metoden behåller inte meddelandets sekretess. för att meddelandet ska vara hemligt måste det också krypteras.

.NET tillhandahåller följande klasser som implementerar algoritmer för digital signatur:

Hash-värden

Hash-algoritmer mappar binära värden med godtycklig längd till mindre binära värden med fast längd, så kallade hash-värden. Ett hash-värde är en numerisk representation av en bit data. Om du hashar ett stycke i klartext och ändrar ens en bokstav i stycket, skapar en efterföljande hash ett annat värde. Om hashen är kryptografiskt stark ändras dess värde avsevärt. Om till exempel en enda bit av ett meddelande ändras kan en stark hash-funktion generera utdata som skiljer sig med 50 procent. Många indatavärden kan hash till samma utdatavärde. Det är dock beräkningsmässigt omöjligt att hitta två distinkta indata som hash till samma värde.

Två parter (Alice och Bob) kan använda en hash-funktion för att säkerställa meddelandeintegriteten. De skulle välja en hash-algoritm för att signera sina meddelanden. Alice skulle skriva ett meddelande och sedan skapa en hash av det meddelandet med hjälp av den valda algoritmen. De skulle sedan följa någon av följande metoder:

  • Alice skickar klartextmeddelandet och det hashade meddelandet (digital signatur) till Bob. Bob tar emot och hashar meddelandet och jämför sitt hash-värde med det hashvärde som han fick från Alice. Om hash-värdena är identiska ändrades inte meddelandet. Om värdena inte är identiska ändrades meddelandet efter att Alice skrev det.

    Tyvärr fastställer inte den här metoden avsändarens äkthet. Vem som helst kan personifiera Alice och skicka ett meddelande till Bob. De kan använda samma hash-algoritm för att signera sitt meddelande, och allt Bob kan avgöra är att meddelandet matchar dess signatur. Det här är en form av en man-in-the-middle-attack. Mer information finns i Exempel på säker kommunikation med kryptografi nästa generation (CNG).

  • Alice skickar klartextmeddelandet till Bob via en offentlig kanal som inte är säkerhetsskyddad. Hon skickar hash-meddelandet till Bob via en säker privat kanal. Bob tar emot klartextmeddelandet, hashar det och jämför hashen med den privat utväxlade hashen. Om hashvärden matchar vet Bob två saker:

    • Meddelandet har inte ändrats.

    • Avsändaren av meddelandet (Alice) är äkta.

    För att det här systemet ska fungera måste Alice dölja sitt ursprungliga hashvärde från alla parter utom Bob.

  • Alice skickar klartextmeddelandet till Bob via en icke-säkerhetsinriktad offentlig kanal och placerar det hashade meddelandet på sin offentligt synliga webbplats.

    Den här metoden förhindrar meddelandemanipulering genom att förhindra att någon ändrar hash-värdet. Även om meddelandet och dess hash kan läsas av vem som helst kan hash-värdet bara ändras av Alice. En angripare som vill personifiera Alice skulle kräva åtkomst till Alice webbplats.

Ingen av de tidigare metoderna hindrar någon från att läsa Alice meddelanden, eftersom de överförs i klartext. Fullständig säkerhet kräver vanligtvis digitala signaturer (meddelandesignering) och kryptering.

.NET tillhandahåller följande klasser som implementerar hashalgoritmer:

.NET tillhandahåller MD5 även och SHA1. Men MD5- och SHA-1-algoritmerna har visat sig vara osäkra och SHA-2 rekommenderas nu i stället. SHA-2 innehåller SHA256, SHA384 och SHA512.

Slumptalsgenerering

Slumptalsgenerering är en integrerad del av många kryptografiska åtgärder. Kryptografiska nycklar måste till exempel vara så slumpmässiga som möjligt så att det inte går att återskapa dem. Kryptografiska slumptalsgeneratorer måste generera utdata som är beräkningsmässigt omöjliga att förutsäga med en sannolikhet som är bättre än hälften. Därför får inte någon metod för att förutsäga nästa utdatabit prestera bättre än slumpmässig gissning. Klasserna i .NET använder slumptalsgeneratorer för att generera kryptografiska nycklar.

Klassen RandomNumberGenerator är en implementering av en slumptalsgeneratoralgoritm.

ClickOnce-manifest

Med följande kryptografiklasser kan du hämta och verifiera information om manifestsignaturer för program som distribueras med hjälp av ClickOnce-teknik:

Dessutom ger följande klasser specifik signaturinformation:

CNG-klasser (Cryptography Next Generation)

CNG-klasserna (Cryptography Next Generation) tillhandahåller en hanterad omslutning runt de inbyggda CNG-funktionerna. (CNG ersätter CryptoAPI.) Dessa klasser har "Cng" som en del av sina namn. Centralt för CNG-omslutningsklasserna är CngKey nyckelcontainerklassen, som abstraherar lagringen och användningen av CNG-nycklar. Med den här klassen kan du lagra ett nyckelpar eller en offentlig nyckel på ett säkert sätt och referera till det med hjälp av ett enkelt strängnamn. Den elliptiska kurvbaserade ECDsaCng signaturklassen och krypteringsklassen ECDiffieHellmanCng kan använda CngKey objekt.

Klassen CngKey används för en mängd olika ytterligare åtgärder, inklusive att öppna, skapa, ta bort och exportera nycklar. Det ger också åtkomst till det underliggande nyckelhandtaget som ska användas när du anropar inbyggda funktioner direkt.

.NET innehåller också en mängd olika stödklasser för CNG, till exempel följande:

Se även