Kryptering på klientsidan för blobar

Det Azure Blob Storage klientbiblioteket för .NET stöder kryptering av data i klientprogram innan de laddas upp till Azure Storage och dekrypterar data vid nedladdning till klienten. Biblioteket stöder även integrering med Azure 密钥保管库 för hantering av lagringskontonycklar.

Viktigt

Blob Storage stöder kryptering på både tjänstsidan och klientsidan. I de flesta scenarier rekommenderar Microsoft att du använder krypteringsfunktioner på tjänstsidan för enkel användning för att skydda dina data. Mer information om kryptering på tjänstsidan finns i Azure Storage-kryptering för vilande data.

En stegvis självstudiekurs som leder dig genom processen att kryptera blobar med hjälp av kryptering på klientsidan och Azure 密钥保管库 finns i Kryptera och dekryptera blobar i Microsoft Azure Storage med hjälp av Azure 密钥保管库.

Om kryptering på klientsidan

Azure Blob Storage-klientbiblioteket använder AES för att kryptera användardata. Det finns två versioner av kryptering på klientsidan som är tillgängliga i klientbiblioteket:

Varning

Användning av version 1 av kryptering på klientsidan rekommenderas inte längre på grund av en säkerhetsrisk i klientbibliotekets implementering av CBC-läget. Mer information om den här säkerhetsrisken finns i Uppdatera kryptering på klientsidan i SDK för att åtgärda säkerhetsproblem i Azure Storage. Om du för närvarande använder version 1 rekommenderar vi att du uppdaterar programmet så att det använder version 2 och migrerar dina data. Se följande avsnitt , Åtgärda säkerhetsrisken i dina program, för ytterligare vägledning.

Minska säkerhetsrisken i dina program

På grund av en säkerhetsrisk som identifierats i Blob Storage-klientbibliotekets implementering av CBC-läget rekommenderar Microsoft att du vidtar en eller flera av följande åtgärder omedelbart:

  • Överväg att använda krypteringsfunktioner på tjänstsidan i stället för kryptering på klientsidan. Mer information om krypteringsfunktioner på tjänstsidan finns i Azure Storage-kryptering för vilande data.

  • Om du behöver använda kryptering på klientsidan migrerar du dina program från kryptering på klientsidan v1 till kryptering på klientsidan v2.

I följande tabell sammanfattas de steg som du måste utföra om du väljer att migrera dina program till kryptering på klientsidan v2:

Krypteringsstatus på klientsidan Rekommenderade åtgärder
Programmet använder kryptering på klientsidan en version av klientbiblioteket som endast stöder kryptering på klientsidan v1. Uppdatera programmet så att det använder en version av klientbiblioteket som stöder kryptering på klientsidan v2. En lista över versioner som stöds finns i SDK-stödmatris för kryptering på klientsidan . Mer informasjon...

Uppdatera koden så att den använder kryptering på klientsidan v2. Mer informasjon...

Ladda ned krypterade data för att dekryptera dem och kryptera sedan om dem med kryptering på klientsidan v2. Mer informasjon...
Programmet använder kryptering på klientsidan med en version av klientbiblioteket som stöder kryptering på klientsidan v2. Uppdatera koden så att den använder kryptering på klientsidan v2. Mer informasjon...

Ladda ned krypterade data för att dekryptera dem och kryptera sedan om dem med kryptering på klientsidan v2. Mer informasjon...

Dessutom rekommenderar Microsoft att du vidtar följande steg för att skydda dina data:

  • Konfigurera dina lagringskonton så att de använder privata slutpunkter för att skydda all trafik mellan ditt virtuella nätverk (VNet) och ditt lagringskonto via en privat länk. Mer information finns i Använda privata slutpunkter för Azure Storage.
  • Begränsa endast nätverksåtkomst till specifika nätverk.

SDK-stödmatris för kryptering på klientsidan

I följande tabell visas vilka versioner av klientbiblioteken för .NET, Java och Python som stöder vilka versioner av kryptering på klientsidan:

.NET Java Python
Kryptering på klientsidan v2 och v1 Version 12.13.0 och senare Version 12.18.0 och senare Version 12.13.0 och senare
Endast kryptering på klientsidan v1 Version 12.12.0 och tidigare Version 12.17.0 och tidigare Version 12.12.0 och tidigare

Om ditt program använder kryptering på klientsidan med en tidigare version av klientbiblioteket för .NET, Java eller Python måste du först uppgradera koden till en version som stöder kryptering på klientsidan v2. Därefter måste du dekryptera och omkryptera dina data med kryptering på klientsidan v2. Om det behövs kan du använda en version av klientbiblioteket som stöder kryptering på klientsidan v2 sida vid sida med en tidigare version av klientbiblioteket medan du migrerar koden. Kodexempel finns i Exempel: Kryptera och dekryptera en blob med kryptering på klientsidan v2.

Så här fungerar kryptering på klientsidan

I Azure Blob Storage klientbibliotek används kuvertkryptering för att kryptera och dekryptera data på klientsidan. Kuvertkryptering krypterar en nyckel med en eller flera ytterligare nycklar.

Blob Storage-klientbiblioteken förlitar sig på Azure 密钥保管库 för att skydda de nycklar som används för kryptering på klientsidan. Mer information om Azure 密钥保管库 finns i Vad är Azure 密钥保管库?.

Kryptering och dekryptering via kuverttekniken

Kryptering via kuverttekniken fungerar på följande sätt:

  1. Azure Storage-klientbiblioteket genererar en innehållskrypteringsnyckel (CEK), som är en symmetrisk engångsnyckel.

  2. Användardata krypteras med hjälp av CEK.

  3. CEK omsluts sedan (krypteras) med nyckelkrypteringsnyckeln (KEK). Kek identifieras av en nyckelidentifierare och kan vara antingen ett asymmetriskt nyckelpar eller en symmetrisk nyckel. Du kan hantera KEK lokalt eller lagra den i en Azure-密钥保管库.

    Själva Azure Storage-klientbiblioteket har aldrig åtkomst till KEK. Biblioteket anropar nyckelomslutningsalgoritmen som tillhandahålls av 密钥保管库. Användare kan välja att använda anpassade providers för nyckelomslutning/avskrivning om så önskas.

  4. Krypterade data laddas sedan upp till Azure Blob Storage. Den omslutna nyckeln tillsammans med ytterligare krypteringsmetadata lagras som metadata på bloben.

Dekryptering via kuverttekniken fungerar på följande sätt:

  1. Azure Storage-klientbiblioteket förutsätter att användaren hanterar KEK antingen lokalt eller i en Azure-密钥保管库. Användaren behöver inte känna till den specifika nyckel som användes för kryptering. I stället kan en nyckelmatchare som löser olika nyckelidentifierare till nycklar konfigureras och användas.
  2. Klientbiblioteket laddar ned krypterade data tillsammans med krypteringsmaterial som lagras i Azure Storage.
  3. Den omslutna CEK:en) packas sedan upp (dekrypteras) med hjälp av KEK. Klientbiblioteket har inte åtkomst till KEK under den här processen, men anropar bara algoritmen för att packa upp i Azure 密钥保管库 eller något annat nyckelarkiv.
  4. Klientbiblioteket använder CEK för att dekryptera krypterade användardata.

Kryptering/dekryptering vid uppladdning/nedladdning av blob

Blob Storage-klientbiblioteket stöder endast kryptering av hela blobar vid uppladdning. För nedladdningar stöds både fullständiga nedladdningar och intervallnedladdningar.

Under krypteringen genererar klientbiblioteket en slumpmässig initieringsvektor (IV) på 16 byte och en slumpmässig CEK på 32 byte och utför kuvertkryptering av blobdata med hjälp av den här informationen. Den omslutna CEK:en och vissa ytterligare krypteringsmetadata lagras sedan som blobmetadata tillsammans med den krypterade bloben.

När en klient laddar ned en hel blob, packas den omslutna CEK upp och används tillsammans med IV för att returnera de dekrypterade data till klienten.

Att ladda ned ett godtyckligt intervall i den krypterade bloben innebär att justera intervallet som tillhandahålls av användare för att få en liten mängd ytterligare data som kan användas för att dekryptera det begärda intervallet.

Alla blobtyper (blockblobar, sidblobar och tilläggsblobar) kan krypteras/dekrypteras med det här schemat.

Varning

Om du redigerar eller laddar upp dina egna metadata för bloben måste du se till att krypteringsmetadata bevaras. Om du laddar upp nya metadata utan att även bevara krypteringsmetadata kommer den omslutna CEK, IV och andra metadata att gå förlorade och du kommer inte att kunna hämta innehållet i bloben. Om du anropar åtgärden Ange blobmetadata ersätts alltid alla blobmetadata.

När du läser från eller skriver till en krypterad blob använder du hela blobuppladdningskommandon, till exempel Put Blob och range eller hela blobnedladdningskommandon, till exempel Hämta blob. Undvik att skriva till en krypterad blob med protokollåtgärder som Put Block, Put Block List, Put Page eller Addd Block. Att anropa dessa åtgärder på en krypterad blob kan skada den och göra den oläslig.

Exempel: Kryptera och dekryptera en blob med kryptering på klientsidan v2

Kodexemplet i det här avsnittet visar hur du använder kryptering på klientsidan v2 för att kryptera och dekryptera en blob.

Viktigt

Om du har data som tidigare har krypterats med kryptering på klientsidan v1 måste du dekryptera dessa data och omkryptera dem med kryptering på klientsidan v2. Se vägledningen och exemplet för klientbiblioteket nedan.

Om du vill använda kryptering på klientsidan från .NET-koden refererar du till Blob Storage-klientbiblioteket. Kontrollera att du använder version 12.13.0 eller senare. Om du behöver migrera från version 11.x till version 12.13.0 läser du migreringsguiden.

Ytterligare två paket krävs för Azure 密钥保管库-integrering för kryptering på klientsidan:

  • Azure.Core-paketet innehåller gränssnitten IKeyEncryptionKey ochIKeyEncryptionKeyResolver. Blob Storage-klientbiblioteket för .NET definierar redan den här sammansättningen som ett beroende.

  • Paketet Azure.Security.KeyVault.Keys (version 4.x och senare) innehåller 密钥保管库 REST-klienten och de kryptografiska klienter som används med kryptering på klientsidan. Du måste se till att det här paketet refereras till i projektet om du använder Azure 密钥保管库 som nyckelarkiv.

    Azure 密钥保管库 är utformat för huvudnycklar med högt värde, och begränsningsgränser per nyckelvalv återspeglar den här designen. Från och med version 4.1.0 av Azure.Security.KeyVault.Keys IKeyEncryptionKeyResolver stöder gränssnittet inte cachelagring av nycklar. Om cachelagring krävs på grund av begränsning kan du använda den metod som visas i det här exemplet för att mata in ett cachelagringslager i en Azure.Security.KeyVault.Keys.Cryptography.KeyResolver instans.

Utvecklare kan tillhandahålla en nyckel, en nyckellösare eller både en nyckel och en nyckellösare. Nycklar identifieras med hjälp av en nyckelidentifierare som tillhandahåller logiken för omslutning och avskrivning av CEK. En nyckellösare används för att lösa en nyckel under dekrypteringsprocessen. Nyckellösaren definierar en lösningsmetod som returnerar en nyckel med en nyckelidentifierare. Lösningsnyckeln ger användarna möjlighet att välja mellan flera nycklar som hanteras på flera platser.

Vid kryptering används nyckeln alltid och avsaknaden av en nyckel resulterar i ett fel.

Vid dekryptering används nyckeln för dekryptering om nyckeln har angetts och dess identifierare matchar den nyckelidentifierare som krävs. Annars försöker klientbiblioteket anropa matcharen. Om ingen matchare har angetts utlöser klientbiblioteket ett fel. Om en lösning har angetts anropas nyckellösaren för att hämta nyckeln. Om matcharen har angetts men inte har någon mappning för nyckelidentifieraren genererar klientbiblioteket ett fel.

Om du vill använda kryptering på klientsidan skapar du ett ClientSideEncryptionOptions-objekt och ställer in det när klienten skapas med SpecializedBlobClientOptions. Du kan inte ange krypteringsalternativ per API. Allt annat hanteras av klientbiblioteket internt.

// Your key and key resolver instances, either through Azure Key Vault SDK or an external implementation.
IKeyEncryptionKey key;
IKeyEncryptionKeyResolver keyResolver;

// Create the encryption options to be used for upload and download.
ClientSideEncryptionOptions encryptionOptions = new ClientSideEncryptionOptions(ClientSideEncryptionVersion.V2_0)
{
   KeyEncryptionKey = key,
   KeyResolver = keyResolver,
   // String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
   KeyWrapAlgorithm = "some algorithm name"
};

// Set the encryption options on the client options.
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };

// Create blob client with client-side encryption enabled.
// Client-side encryption options are passed from service clients to container clients, 
// and from container clients to blob clients.
// Attempting to construct a BlockBlobClient, PageBlobClient, or AppendBlobClient from a BlobContainerClient
// with client-side encryption options present will throw, as this functionality is only supported with BlobClient.
BlobClient blob = new BlobServiceClient(connectionString, options).GetBlobContainerClient("my-container").GetBlobClient("myBlob");

// Upload the encrypted contents to the blob.
blob.Upload(stream);

// Download and decrypt the encrypted contents from the blob.
MemoryStream outputStream = new MemoryStream();
blob.DownloadTo(outputStream);

Du kan använda krypteringsalternativ för en BlobServiceClient-, BlobContainerClient- eller BlobClient-konstruktor som accepterar BlobClientOptions-objekt .

Om det redan finns ett BlobClient-objekt i koden men saknar krypteringsalternativ på klientsidan kan du använda en tilläggsmetod för att skapa en kopia av objektet med angivna ClientSideEncryptionOptions. Den här tilläggsmetoden undviker att skapa ett nytt BlobClient-objekt från grunden.

using Azure.Storage.Blobs.Specialized;

// An existing BlobClient instance and encryption options.
BlobClient plaintextBlob;
ClientSideEncryptionOptions encryptionOptions;

// Get a copy of the blob that uses client-side encryption.
BlobClient clientSideEncryptionBlob = plaintextBlob.WithClientSideEncryptionOptions(encryptionOptions);

När du har uppdaterat koden för att använda kryptering på klientsidan v2 kontrollerar du att du dekrypterar och omkrypterar befintliga krypterade data enligt beskrivningen i Reencrypt tidigare krypterade data med kryptering på klientsidan v2.

Omkryptera tidigare krypterade data med kryptering på klientsidan v2

Alla data som tidigare har krypterats med kryptering på klientsidan v1 måste dekrypteras och sedan dekrypteras på nytt med kryptering på klientsidan v2 för att minska säkerhetsrisken. Dekryptering kräver nedladdning av data och omkryptering kräver att den laddas upp på nytt till Blob Storage.

Ett exempelprojekt som visar hur du migrerar data från kryptering på klientsidan v1 till v2 och hur du krypterar data med kryptering på klientsidan v2 i .NET finns i exempelprojektet krypteringsmigrering.

Kryptering och prestanda på klientsidan

Tänk på att kryptering av dina lagringsdata resulterar i ytterligare prestandakostnader. När du använder kryptering på klientsidan i ditt program måste klientbiblioteket på ett säkert sätt generera CEK och IV, kryptera själva innehållet, kommunicera med det valda nyckelarkivet för nyckel-omslutning och formatera och ladda upp ytterligare metadata. Den här kostnaden varierar beroende på mängden data som krypteras. Vi rekommenderar att kunderna alltid testar sina program för prestanda under utvecklingen.

Nästa steg