Clientseitige Verschlüsselung und Azure Key Vault für Microsoft Azure StorageClient-Side Encryption and Azure Key Vault for Microsoft Azure Storage

ÜbersichtOverview

Die Azure Storage-Clientbibliothek für .NET unterstützt die Verschlüsselung von Daten innerhalb von Clientanwendungen vor dem Hochladen der Daten nach Azure Storage sowie die Entschlüsselung von Daten während des Herunterladens auf den Client.The Azure Storage Client Library for .NET supports encrypting data within client applications before uploading to Azure Storage, and decrypting data while downloading to the client. Um die Schlüsselverwaltung für Speicherkonten zu ermöglichen, unterstützt die Bibliothek zudem die Integration in Azure Key Vault.The library also supports integration with Azure Key Vault for storage account key management.

Ein ausführliches Tutorial, das Sie Schritt für Schritt durch die Verschlüsselung von Blobs mittels clientseitiger Verschlüsselung und Azure Key Vault führt, finden Sie unter Verschlüsseln und Entschlüsseln von Blobs in Microsoft Azure Storage per Azure-Schlüsseltresor.For a step-by-step tutorial that leads you through the process of encrypting blobs using client-side encryption and Azure Key Vault, see Encrypt and decrypt blobs in Microsoft Azure Storage using Azure Key Vault.

Informationen zur clientseitigen Verschlüsselung mit Java finden Sie unter Clientseitige Verschlüsselung mit Java für Microsoft Azure Storage.For client-side encryption with Java, see Client-Side Encryption with Java for Microsoft Azure Storage.

Verschlüsselung und Entschlüsselung über das UmschlagverfahrenEncryption and decryption via the envelope technique

Die Prozesse bei der Verschlüsselung und Entschlüsselung folgen dem Umschlagverfahren.The processes of encryption and decryption follow the envelope technique.

Verschlüsselung über das UmschlagverfahrenEncryption via the envelope technique

Die Verschlüsselung über das Umschlagverfahren funktioniert wie folgt:Encryption via the envelope technique works in the following way:

  1. Die Azure-Speicherclientbibliothek generiert einen Inhaltsverschlüsselungsschlüssel (Content Encryption Key, CEK), bei dem es sich um einen einmalig verwendeten symmetrischen Schlüssel handelt.The Azure storage client library generates a content encryption key (CEK), which is a one-time-use symmetric key.

  2. Benutzerdaten werden mit diesem CEK verschlüsselt.User data is encrypted using this CEK.

  3. Der CEK wird dann mit dem Schlüsselverschlüsselungsschlüssel (Key Encryption Key, KEK) umschlossen (verschlüsselt).The CEK is then wrapped (encrypted) using the key encryption key (KEK). Der KEK wird anhand eines Schlüsselbezeichners identifiziert und kann ein asymmetrisches Schlüsselpaar oder ein symmetrischer Schlüssel sein. Er kann lokal verwaltet oder im Azure-Schlüsseltresor gespeichert werden.The KEK is identified by a key identifier and can be an asymmetric key pair or a symmetric key and can be managed locally or stored in Azure Key Vaults.

    Die Speicherclientbibliothek hat selbst nie Zugriff auf den KEK.The storage client library itself never has access to KEK. Die Bibliothek ruft lediglich den Algorithmus für das Umschließen des Schlüssels aus, der vom Schlüsseltresor bereitgestellt wird.The library invokes the key wrapping algorithm that is provided by Key Vault. Benutzer können bei Bedarf benutzerdefinierte Anbieter für das Umschließen von Schlüsseln bzw. das Aufheben dieses Zustands verwenden.Users can choose to use custom providers for key wrapping/unwrapping if desired.

  4. Die verschlüsselten Daten werden dann in den Azure Storage-Dienst hochgeladen.The encrypted data is then uploaded to the Azure Storage service. Der umschlossene Schlüssel und einige zusätzliche Verschlüsselungsmetadaten werden entweder als Metadaten (in einem Blob) gespeichert oder mit den verschlüsselten Daten (Warteschlangennachrichten und Tabellenentitäten) interpoliert.The wrapped key along with some additional encryption metadata is either stored as metadata (on a blob) or interpolated with the encrypted data (queue messages and table entities).

Entschlüsselung über das UmschlagverfahrenDecryption via the envelope technique

Die Entschlüsselung über das Umschlagverfahren funktioniert wie folgt:Decryption via the envelope technique works in the following way:

  1. Die Clientbibliothek geht davon aus, dass der Benutzer den Schlüsselverschlüsselungschlüssel (Key Encryption Key, KEK) entweder lokal oder in Azure-Schlüsseltresoren verwaltet.The client library assumes that the user is managing the key encryption key (KEK) either locally or in Azure Key Vaults. Der Benutzer muss den spezifischen Schlüssel, der für die Verschlüsselung verwendet wurde, nicht kennen.The user does not need to know the specific key that was used for encryption. Stattdessen kann ein Schlüsselresolver eingerichtet und verwendet werden, der verschiedene Schlüsselkennungen in Schlüssel auflöst.Instead, a key resolver which resolves different key identifiers to keys can be set up and used.
  2. Die Clientbibliothek lädt die verschlüsselten Daten zusammen mit sämtlichem Verschlüsselungsmaterial herunter, das für den Dienst gespeichert ist.The client library downloads the encrypted data along with any encryption material that is stored on the service.
  3. Der umschlossene Inhaltsverschlüsselungsschlüssel (Content Encryption Key, CEK) wird dann mithilfe des Schlüsselverschlüsselungschlüssels (Key Encryption Key, KEK) entpackt.The wrapped content encryption key (CEK) is then unwrapped (decrypted) using the key encryption key (KEK). Die Clientbibliothek hat wiederum keinen Zugriff auf den KEK.Here again, the client library does not have access to KEK. Sie ruft einfach den benutzerdefinierten Entpackungsalgorithmus oder den Entpackungsalgorithmus des Schlüsseltresoranbieters auf.It simply invokes the custom or Key Vault provider's unwrapping algorithm.
  4. Der Inhaltsverschlüsselungsschlüssel (CEK) wird dann zum Entschlüsseln der verschlüsselten Benutzerdaten verwendet.The content encryption key (CEK) is then used to decrypt the encrypted user data.

VerschlüsselungsmechanismusEncryption Mechanism

Die Speicherclientbibliothek verwendet AES , um Benutzerdaten zu verschlüsseln.The storage client library uses AES in order to encrypt user data. Insbesondere wird der CBC-Modus (Blockchiffreverkettung, Cipher Block Chaining) mit AES verwendet.Specifically, Cipher Block Chaining (CBC) mode with AES. Da jeder Dienst eine andere Funktionsweise aufweist, werden die Dienste hier erörtert.Each service works somewhat differently, so we will discuss each of them here.

Blobs (in englischer Sprache)Blobs

Die Clientbibliothek unterstützt momentan nur die Verschlüsselung vollständiger Blobs.The client library currently supports encryption of whole blobs only. Insbesondere wird die Verschlüsselung unterstützt, wenn Benutzer die UploadFrom-Methoden oder OpenWrite-Methode verwenden.Specifically, encryption is supported when users use the UploadFrom methods or the OpenWrite method. Es werden sowohl vollständige Downloads als auch Downloads von Bereichen unterstützt.For downloads, both complete and range downloads are supported.

Bei der Verschlüsselung generiert die Clientbibliothek einen zufälligen Initialisierungsvektor (IV) mit einer Größe von 16 Byte zusammen mit einem zufälligen Inhaltsverschlüsselungsschlüssel (CEK) mit einer Größe von 32 Byte. Mithilfe dieser Informationen wird die Umschlagverschlüsselung der Blobdaten ausgeführt.During encryption, the client library will generate a random Initialization Vector (IV) of 16 bytes, together with a random content encryption key (CEK) of 32 bytes, and perform envelope encryption of the blob data using this information. Der umschlossene CEK und einige zusätzliche Verschlüsselungsmetadaten werden dann als Blobmetadaten zusammen mit dem verschlüsselten Blob für den Dienst gespeichert.The wrapped CEK and some additional encryption metadata are then stored as blob metadata along with the encrypted blob on the service.

Warnung

Wenn Sie eigene Metadaten für den Blob bearbeiten oder hochladen, müssen Sie sicherstellen, dass diese Metadaten beibehalten werden.If you are editing or uploading your own metadata for the blob, you need to ensure that this metadata is preserved. Wenn Sie neue Metadaten ohne diese Metadaten hochladen, gehen der umschlossene CEK, der IV und andere Metadaten verloren, und der Blobinhalt wird nie wieder abrufbar sein.If you upload new metadata without this metadata, the wrapped CEK, IV, and other metadata will be lost and the blob content will never be retrievable again.

Beim Herunterladen eines verschlüsselten Blobs wird der Inhalt des gesamten Blobs mit den DownloadTo/BlobReadStream-Hilfsmethoden abgerufen.Downloading an encrypted blob involves retrieving the content of the entire blob using the DownloadTo/BlobReadStream convenience methods. Der umschlossene CEK wird entpackt und zusammen mit dem IV (in diesem Fall als Blobmetadaten gespeichert) verwendet, um die entschlüsselten Daten an die Benutzer zurückzugeben.The wrapped CEK is unwrapped and used together with the IV (stored as blob metadata in this case) to return the decrypted data to the users.

Beim Herunterladen eines beliebigen Bereichs (downloadRange-Methoden) im verschlüsselten Blob wird der von den Benutzern angegebene Bereich angepasst, um eine kleine Menge zusätzlicher Daten abzurufen, die verwendet werden können, um den angeforderten Bereich erfolgreich zu entschlüsseln.Downloading an arbitrary range (DownloadRange methods) in the encrypted blob involves adjusting the range provided by users in order to get a small amount of additional data that can be used to successfully decrypt the requested range.

Alle Blobtypen (Blockblobs, Seitenblobs und Anfügeblobs) können mit diesem Schema verschlüsselt/entschlüsselt werden.All blob types (block blobs, page blobs, and append blobs) can be encrypted/decrypted using this scheme.

WarteschlangenQueues

Da Warteschlangenmeldungen ein beliebiges Format aufweisen können, definiert die Clientbibliothek ein benutzerdefiniertes Format, das den Initialisierungsvektor (IV) und den verschlüsselten Inhaltsverschlüsselungsschlüssel (CEK) im Meldungstext enthält.Since queue messages can be of any format, the client library defines a custom format that includes the Initialization Vector (IV) and the encrypted content encryption key (CEK) in the message text.

Bei der Verschlüsselung generiert die Clientbibliothek einen zufälligen IV mit einer Größe von 16 Byte zusammen mit einem zufälligen CEK mit einer Größe von 32 Byte. Mithilfe dieser Informationen wird die Umschlagverschlüsselung des Texts der Warteschlangenmeldung durchgeführt.During encryption, the client library generates a random IV of 16 bytes along with a random CEK of 32 bytes and performs envelope encryption of the queue message text using this information. Der umschlossene CEK und einige zusätzliche Verschlüsselungsmetadaten werden der verschlüsselten Warteschlangenmeldung dann hinzugefügt.The wrapped CEK and some additional encryption metadata are then added to the encrypted queue message. Diese geänderte Meldung (siehe unten) wird für den Dienst gespeichert.This modified message (shown below) is stored on the service.

<MessageText>{"EncryptedMessageContents":"6kOu8Rq1C3+M1QO4alKLmWthWXSmHV3mEfxBAgP9QGTU++MKn2uPq3t2UjF1DO6w","EncryptionData":{…}}</MessageText>

Bei der Entschlüsselung wird der umschlossene Schlüssel aus der Warteschlangenmeldung extrahiert und entpackt.During decryption, the wrapped key is extracted from the queue message and unwrapped. Der Initialisierungsvektor wird ebenfalls aus der Warteschlangenmeldung extrahiert und zusammen mit dem entpackten Schlüssel verwendet, um die Daten der Warteschlangenmeldung zu entschlüsseln.The IV is also extracted from the queue message and used along with the unwrapped key to decrypt the queue message data. Beachten Sie, dass die Verschlüsselungsmetadaten eine geringe Größe aufweisen (weniger als 500 Byte). Dies wird zwar für die 64-KB-Begrenzung für eine Warteschlangenmeldung angerechnet, die Auswirkungen sollten vertretbar sein.Note that the encryption metadata is small (under 500 bytes), so while it does count toward the 64KB limit for a queue message, the impact should be manageable.

TabellenTables

Die Clientbibliothek unterstützt die Verschlüsselung von Entitätseigenschaften für Einfüge- und Ersetzungsvorgänge.The client library supports encryption of entity properties for insert and replace operations.

Hinweis

Das Zusammenführen wird derzeit nicht unterstützt.Merge is not currently supported. Da eine Teilmenge der Eigenschaften möglicherweise bereits mit einem anderen Schlüssel verschlüsselt wurde, führen das einfache Zusammenführen der neuen Eigenschaften und das Aktualisieren der Metadaten zu Datenverlusten.Since a subset of properties may have been encrypted previously using a different key, simply merging the new properties and updating the metadata will result in data loss. Das Zusammenführen erfordert entweder zusätzliche Dienstaufrufe, um die bereits vorhandene Entität aus dem Dienst zu lesen, oder die Verwendung eines neuen Schlüssels pro Eigenschaft. Beide Verfahren sind aus Leistungsgründen nicht geeignet.Merging either requires making extra service calls to read the pre-existing entity from the service, or using a new key per property, both of which are not suitable for performance reasons.

Die Verschlüsselung von Tabellendaten funktioniert wie folgt:Table data encryption works as follows:

  1. Die Benutzer geben die Eigenschaften an, die verschlüsselt werden sollen.Users specify the properties to be encrypted.
  2. Die Clientbibliothek generiert einen zufälligen Initialisierungsvektor (IV) mit einer Größe von 16 Byte zusammen mit einem zufälligen Inhaltsverschlüsselungsschlüssel (CEK) mit einer Größe von 32 Byte für jede Entität und führt die Umschlagverschlüsselung für die einzelnen zu verschlüsselnden Eigenschaften durch, indem ein neuer IV pro Eigenschaft abgeleitet wird.The client library generates a random Initialization Vector (IV) of 16 bytes along with a random content encryption key (CEK) of 32 bytes for every entity, and performs envelope encryption on the individual properties to be encrypted by deriving a new IV per property. Die verschlüsselte Eigenschaft wird als Binärdaten gespeichert.The encrypted property is stored as binary data.
  3. Der umschlossene CEK und einige zusätzliche Verschlüsselungsmetadaten werden dann als zwei zusätzliche reservierte Eigenschaften gespeichert.The wrapped CEK and some additional encryption metadata are then stored as two additional reserved properties. Die erste reservierte Eigenschaft ("_ClientEncryptionMetadata1") ist eine Zeichenfolgeneigenschaft, die die Informationen über den IV, die Version und den umschlossenen Schlüssel enthält.The first reserved property (_ClientEncryptionMetadata1) is a string property that holds the information about IV, version, and wrapped key. Die zweite reservierte Eigenschaft ("_ClientEncryptionMetadata2") ist eine binäre Eigenschaft, die die Informationen zu den Eigenschaften enthält, die verschlüsselt werden.The second reserved property (_ClientEncryptionMetadata2) is a binary property that holds the information about the properties that are encrypted. Die Informationen in dieser zweiten-Eigenschaft ("_ClientEncryptionMetadata2") sind selbst verschlüsselt.The information in this second property (_ClientEncryptionMetadata2) is itself encrypted.
  4. Aufgrund dieser zusätzlichen reservierten Eigenschaften, die für die Verschlüsselung erforderlich sind, verfügen die Benutzer jetzt möglicherweise nur über 250 benutzerdefinierte Eigenschaften anstelle von 252.Due to these additional reserved properties required for encryption, users may now have only 250 custom properties instead of 252. Die Gesamtgröße der Entität muss weniger als 1 MB betragen.The total size of the entity must be less than 1 MB.

Beachten Sie, dass nur Zeichenfolgeneigenschaften verschlüsselt werden können.Note that only string properties can be encrypted. Wenn andere Typen von Eigenschaften verschlüsselt werden sollen, müssen sie in Zeichenfolgen konvertiert werden.If other types of properties are to be encrypted, they must be converted to strings. Die verschlüsselten Zeichenfolgen werden als binäre Eigenschaften für den Dienst gespeichert, und sie werden nach der Entschlüsselung wieder in Zeichenfolgen konvertiert.The encrypted strings are stored on the service as binary properties, and they are converted back to strings after decryption.

Für Tabellen müssen die Benutzer zusätzlich zur Verschlüsselungsrichtlinie die Eigenschaften angeben, die verschlüsselt werden sollen.For tables, in addition to the encryption policy, users must specify the properties to be encrypted. Dies kann erfolgen, indem ein [EncryptProperty]-Attribut (für POCO-Entitäten, die von "TableEntity" abgeleitet werden) oder ein Verschlüsselungsresolver in den Anforderungsoptionen angegeben werden.This can be done by either specifying an [EncryptProperty] attribute (for POCO entities that derive from TableEntity) or an encryption resolver in request options. Ein Verschlüsselungsresolver ist ein Delegat, der einen Partitionsschlüssel, einen Zeilenschlüssel und einen Eigenschaftennamen annimmt und einen booleschen Wert zurückgibt, der angibt, ob die Eigenschaft verschlüsselt werden soll.An encryption resolver is a delegate that takes a partition key, row key, and property name and returns a Boolean that indicates whether that property should be encrypted. Bei der Verschlüsselung verwendet die Clientbibliothek diese Informationen, um zu entscheiden, ob eine Eigenschaft beim Schreiben in das Netzwerk verschlüsselt werden soll.During encryption, the client library will use this information to decide whether a property should be encrypted while writing to the wire. Der Delegat bietet zudem die Möglichkeit einer Logik bezüglich der Verschlüsselung der Eigenschaften.The delegate also provides for the possibility of logic around how properties are encrypted. (Beispiel: Wenn X, dann wird Eigenschaft A verschlüsselt, andernfalls werden die Eigenschaften A und B verschlüsselt.) Beachten Sie, dass es nicht notwendig ist, diese Informationen beim Lesen oder Abfragen von Entitäten bereitzustellen.(For example, if X, then encrypt property A; otherwise encrypt properties A and B.) Note that it is not necessary to provide this information while reading or querying entities.

BatchvorgängeBatch Operations

Bei Batchvorgängen wird derselbe KEK für alle Zeilen in einem Batchvorgang verwendet, da die Clientbibliothek nur ein Optionenobjekt (und somit eine Richtlinie/einen KEK) pro Batchvorgang zulässt.In batch operations, the same KEK will be used across all the rows in that batch operation because the client library only allows one options object (and hence one policy/KEK) per batch operation. Allerdings generiert die Clientbibliothek intern einen neuen zufälligen IV und einen zufälligen CEK pro Zeile im Batch .However, the client library will internally generate a new random IV and random CEK per row in the batch. Die Benutzer können auch verschiedene Eigenschaften für jeden Vorgang im Batch verschlüsseln, indem dieses Verhalten im Verschlüsselungsresolver definiert wird.Users can also choose to encrypt different properties for every operation in the batch by defining this behavior in the encryption resolver.

AbfragenQueries

Hinweis

Da die Entitäten verschlüsselt sind, können Sie keine Abfragen ausführen, die nach einer verschlüsselten Eigenschaft filtern.Because the entities are encrypted, you cannot run queries that filter on an encrypted property. Wenn Sie dies versuchen, erhalten Sie falsche Ergebnisse, da der Dienst verschlüsselte Daten mit unverschlüsselten Daten vergleicht.If you try, results will be incorrect, because the service would be trying to compare encrypted data with unencrypted data.

Zum Ausführen von Abfragevorgängen müssen Sie einen Schlüsselresolver angeben, der alle Schlüssel im Resultset auflösen kann.To perform query operations, you must specify a key resolver that is able to resolve all the keys in the result set. Wenn eine im Abfrageergebnis enthaltene Entität nicht in einen Anbieter aufgelöst werden kann, löst die Clientbibliothek einen Fehler aus.If an entity contained in the query result cannot be resolved to a provider, the client library will throw an error. Für jede Abfrage, die serverseitige Projektionen ausführt, fügt die Clientbibliothek den ausgewählten Spalten standardmäßig die spezifischen Verschlüsselungsmetadateneigenschaften („_ClientEncryptionMetadata1“ und „_ClientEncryptionMetadata2“) hinzu.For any query that performs server-side projections, the client library will add the special encryption metadata properties (_ClientEncryptionMetadata1 and _ClientEncryptionMetadata2) by default to the selected columns.

Azure Key VaultAzure Key Vault

Azure Key Vault unterstützt Sie dabei, kryptografische Schlüssel und Geheimnisse zu schützen, die von Cloudanwendungen und -diensten verwendet werden.Azure Key Vault helps safeguard cryptographic keys and secrets used by cloud applications and services. Durch Verwenden des Azure-Schlüsseltresors können Benutzer Schlüssel und geheime Schlüssel (beispielsweise Authentifizierungsschlüssel, Schlüssel für Speicherkonten, Datenverschlüsselungsschlüssel, PFX-Dateien und Kennwörter) verschlüsseln, indem sie durch Hardwaresicherheitsmodule (HSMs) geschützte Schlüssel verwenden.By using Azure Key Vault, users can encrypt keys and secrets (such as authentication keys, storage account keys, data encryption keys, .PFX files, and passwords) by using keys that are protected by hardware security modules (HSMs). Weitere Informationen finden Sie unter Was ist der Azure-Schlüsseltresor?.For more information, see What is Azure Key Vault?.

Die Speicherclientbibliothek verwendet die Schlüsseltresor-Kernbibliothek, um ein gemeinsames Framework zum Verwalten von Schlüsseln innerhalb von Azure bereitzustellen.The storage client library uses the Key Vault core library in order to provide a common framework across Azure for managing keys. Ein zusätzlicher Vorteil für die Benutzer besteht in der Verwendung der Schlüsseltresor-Erweiterungsbibliothek.Users also get the additional benefit of using the Key Vault extensions library. Die Erweiterungsbibliothek bietet nützliche Funktionen für die einfache und nahtlose Nutzung von lokalen und Cloudschlüsselanbietern von symmetrischen/RSA-Schlüsseln sowie für Aggregation und Zwischenspeicherung.The extensions library provides useful functionality around simple and seamless Symmetric/RSA local and cloud key providers as well as with aggregation and caching.

Schnittstelle und AbhängigkeitenInterface and dependencies

Es gibt drei Schlüsseltresorpakete:There are three Key Vault packages:

  • "Microsoft.Azure.KeyVault.Core" enthält "IKey" und "IKeyResolver".Microsoft.Azure.KeyVault.Core contains the IKey and IKeyResolver. Dies ist ein kleines Paket ohne Abhängigkeiten.It is a small package with no dependencies. Die Speicherclientbibliothek für .NET definiert es als Abhängigkeit.The storage client library for .NET defines it as a dependency.
  • "Microsoft.Azure.KeyVault" enthält den REST-Client des Schlüsseltresors.Microsoft.Azure.KeyVault contains the Key Vault REST client.
  • "Microsoft.Azure.KeyVault.Extensions" enthält Erweiterungscode, der Implementierungen von kryptografischen Algorithmen sowie einen RSA-Schlüssel und einen symmetrischen Schlüssel beinhaltet.Microsoft.Azure.KeyVault.Extensions contains extension code that includes implementations of cryptographic algorithms and an RSAKey and a SymmetricKey. Dieser hängt von den Namespaces "Core" und "KeyVault" ab und bietet Funktionen zum Definieren eines Aggregatresolvers (wenn die Benutzer mehrere Schlüsselanbieter verwenden möchten) und eines Cacheschlüsselresolvers.It depends on the Core and KeyVault namespaces and provides functionality to define an aggregate resolver (when users want to use multiple key providers) and a caching key resolver. Obwohl die Speicherclientbibliothek nicht direkt von diesem Paket abhängig ist, benötigen die Benutzer dieses Paket, wenn sie den Azure-Schlüsseltresor zum Speichern ihrer Schlüssel verwenden möchten oder wenn sie die Schlüsseltresorerweiterungen verwenden möchten, um die lokalen und Cloudkryptografieanbieter zu nutzen.Although the storage client library does not directly depend on this package, if users wish to use Azure Key Vault to store their keys or to use the Key Vault extensions to consume the local and cloud cryptographic providers, they will need this package.

Der Schlüsseltresor ist für hochwertige Hauptschlüssel ausgelegt und der Begrenzungsdrosselung über den Schlüsseltresor liegt dieses Konzept zugrunde.Key Vault is designed for high-value master keys, and throttling limits per Key Vault are designed with this in mind. Bei der Durchführung von clientseitiger Verschlüsselung mit dem Schlüsseltresor besteht die bevorzugte Methode darin, symmetrische Hauptschlüssel zu verwenden, die als geheime Schlüssel im Schlüsseltresor gespeichert sind und lokal zwischengespeichert werden.When performing client-side encryption with Key Vault, the preferred model is to use symmetric master keys stored as secrets in Key Vault and cached locally. Die Benutzer müssen wie folgt vorgehen:Users must do the following:

  1. Erstellen Sie offline einen geheimen Schlüssel und laden Sie ihn in den Schlüsseltresor hoch.Create a secret offline and upload it to Key Vault.
  2. Verwenden Sie den Basisbezeichner des geheimen Schlüssels als Parameter, um die aktuelle Version des geheimen Schlüssels für die Verschlüsselung aufzulösen und diese Informationen lokal zwischenzuspeichern.Use the secret's base identifier as a parameter to resolve the current version of the secret for encryption and cache this information locally. Verwenden Sie "CachingKeyResolver" für die Zwischenspeicherung. Es wird nicht erwartet, dass die Benutzer eigene Logik für das Zwischenspeichern implementieren.Use CachingKeyResolver for caching; users are not expected to implement their own caching logic.
  3. Verwenden Sie beim Erstellen der Verschlüsselungsrichtlinie den Zwischenspeicherungsresolver als Eingabe.Use the caching resolver as an input while creating the encryption policy.

Weitere Informationen zur Verwendung des Schlüsseltresors finden Sie in den Beispielen für Verschlüsselungscode.More information regarding Key Vault usage can be found in the encryption code samples.

Bewährte MethodenBest practices

Verschlüsselungsunterstützung ist nur in der Speicherclientbibliothek für .NET verfügbar.Encryption support is available only in the storage client library for .NET. Windows Phone und Windows-Runtime unterstützen derzeit keine Verschlüsselung.Windows Phone and Windows Runtime do not currently support encryption.

Wichtig

Beachten Sie bei Verwendung einer clientseitigen Verschlüsselung die folgenden wichtigen Punkte:Be aware of these important points when using client-side encryption:

  • Verwenden Sie beim Lesen aus einem verschlüsselten Blob oder beim Schreiben in diesen Befehle zum Hochladen des vollständigen Blobs und zum Herunterladen des bereichsbasierten oder vollständigen Blobs.When reading from or writing to an encrypted blob, use whole blob upload commands and range/whole blob download commands. Vermeiden Sie beim Schreiben in einen verschlüsselten Blob Protokollvorgänge wie z. B. "Put Block", "Put Block List", "Write Pages", "Clear Pages" oder "Append Block". Andernfalls wird der verschlüsselte Blob möglicherweise beschädigt und kann nicht mehr gelesen werden.Avoid writing to an encrypted blob using protocol operations such as Put Block, Put Block List, Write Pages, Clear Pages, or Append Block; otherwise you may corrupt the encrypted blob and make it unreadable.
  • Für Tabellen gilt eine ähnliche Einschränkung.For tables, a similar constraint exists. Achten Sie darauf, dass Sie beim Aktualisieren verschlüsselter Eigenschaften auch die Verschlüsselungsmetadaten aktualisieren.Be careful to not update encrypted properties without updating the encryption metadata.
  • Wenn Sie Metadaten für den verschlüsselten Blob festlegen, werden die für die Entschlüsselung erforderlichen verschlüsselungsbezogenen Metadaten möglicherweise überschrieben, da das Festlegen von Metadaten kein additiver Vorgang ist.If you set metadata on the encrypted blob, you may overwrite the encryption-related metadata required for decryption, since setting metadata is not additive. Dies gilt auch für Momentaufnahmen: Geben Sie während der Erstellung einer Momentaufnahme eines verschlüsselten Blobs keine Metadaten an.This is also true for snapshots; avoid specifying metadata while creating a snapshot of an encrypted blob. Wenn Metadaten festgelegt werden müssen, rufen Sie zunächst die FetchAttributes-Methode auf, um die aktuellen Verschlüsselungsmetadaten abzurufen. Vermeiden Sie zudem gleichzeitige Schreibvorgänge, während Metadaten festgelegt werden.If metadata must be set, be sure to call the FetchAttributes method first to get the current encryption metadata, and avoid concurrent writes while metadata is being set.
  • Aktivieren Sie die RequireEncryption -Eigenschaft in Standardanforderungsoptionen für Benutzer, die nur mit verschlüsselten Daten arbeiten sollen.Enable the RequireEncryption property in the default request options for users that should work only with encrypted data. Weitere Details finden Sie nachstehend.See below for more info.

Client-API/SchnittstelleClient API / Interface

Beim Erstellen eines EncryptionPolicy-Objekts können die Benutzer nur einen Schlüssel ("IKey"-Implementierung), nur einen Resolver (IKeyResolver-Implementierung) oder beides bereitstellen.While creating an EncryptionPolicy object, users can provide only a Key (implementing IKey), only a resolver (implementing IKeyResolver), or both. "IKey" ist der grundlegende Schlüsseltyp, der mit einer Schlüsselkennung gekennzeichnet wird und der die Logik für das Einschließen/Entpacken bereitstellt.IKey is the basic key type that is identified using a key identifier and that provides the logic for wrapping/unwrapping. "IKeyResolver" wird verwendet, um einen Schlüssel während des Entschlüsselungsvorgangs aufzulösen.IKeyResolver is used to resolve a key during the decryption process. Er definiert eine ResolveKey-Methode, die bei einer angegebenen Schlüsselkennung einen "IKey" zurückgibt.It defines a ResolveKey method that returns an IKey given a key identifier. Dies ermöglicht den Benutzern die Auswahl zwischen mehreren Schlüsseln, die an mehreren Speicherorten verwaltet werden.This provides users the ability to choose between multiple keys that are managed in multiple locations.

  • Für die Verschlüsselung wird immer der Schlüssel verwendet. Ein fehlender Schlüssel führt zu einem Fehler.For encryption, the key is used always and the absence of a key will result in an error.
  • Für die Entschlüsselung gilt:For decryption:
    • Der Schlüsselresolver wird aufgerufen, wenn er angegeben wurde, um den Schlüssel abzurufen.The key resolver is invoked if specified to get the key. Wenn der Resolver angegeben wird, dieser aber nicht über eine Zuordnung für die Schlüsselkennung verfügt, wird ein Fehler ausgelöst.If the resolver is specified but does not have a mapping for the key identifier, an error is thrown.
    • Ist kein Resolver, aber ein Schlüssel angegeben, wird der Schlüssel verwendet, wenn seine Kennung mit der geforderten Schlüsselkennung übereinstimmt.If resolver is not specified but a key is specified, the key is used if its identifier matches the required key identifier. Stimmt die Kennung nicht überein, wird ein Fehler ausgelöst.If the identifier does not match, an error is thrown.

Die Codebeispiele in diesem Artikel veranschaulichen das Festlegen einer Verschlüsselungsrichtlinie und das Arbeiten mit verschlüsselten Daten, nicht jedoch das Arbeiten mit Azure Key Vault.The code examples in this article demonstrate setting an encryption policy and working with encrypted data, but do not demonstrate working with Azure Key Vault. Die Verschlüsselungsbeispiele auf GitHub veranschaulichen ein ausführlicheres End-to-End-Szenario für Blobs, Warteschlangen und Tabellen und für die Schlüsseltresorintegration.The encryption samples on GitHub demonstrate a more detailed end-to-end scenario for blobs, queues and tables, along with Key Vault integration.

RequireEncryption-ModusRequireEncryption mode

Benutzer können optional einen Betriebsmodus aktivieren, in dem alle hoch- oder herunterzuladenden Daten verschlüsselt werden müssen.Users can optionally enable a mode of operation where all uploads and downloads must be encrypted. In diesem Modus schlagen Versuche, Daten ohne eine Verschlüsselungsrichtlinie hochzuladen oder Daten herunterzuladen, die nicht für den Dienst verschlüsselt sind, auf dem Client fehl.In this mode, attempts to upload data without an encryption policy or download data that is not encrypted on the service will fail on the client. Die RequireEncryption -Eigenschaft des Objekts für Anforderungsoptionen steuert dieses Verhalten.The RequireEncryption property of the request options object controls this behavior. Wenn Ihre Anwendung alle Objekte verschlüsselt, die in Azure Storage gespeichert sind, können Sie die RequireEncryption -Eigenschaft in den Standardanforderungsoptionen für das Dienstclientobjekt festlegen.If your application will encrypt all objects stored in Azure Storage, then you can set the RequireEncryption property on the default request options for the service client object. Legen Sie beispielsweise CloudBlobClient.DefaultRequestOptions.RequireEncryption auf true fest, um Verschlüsselung für alle Blobvorgänge zu erfordern, die über dieses Clientobjekt ausgeführt werden.For example, set CloudBlobClient.DefaultRequestOptions.RequireEncryption to true to require encryption for all blob operations performed through that client object.

Blob-DiensterschlüsselungBlob service encryption

Erstellen Sie ein BlobEncryptionPolicy-Objekt, und legen Sie es in den Anforderungsoptionen fest (über die API oder auf Clientebene mit DefaultRequestOptions).Create a BlobEncryptionPolicy object and set it in the request options (per API or at a client level by using DefaultRequestOptions). Alles Weitere wird intern von der Clientbibliothek behandelt.Everything else will be handled by the client library internally.

// Create the IKey used for encryption.
 RsaKey key = new RsaKey("private:key1" /* key identifier */);

 // Create the encryption policy to be used for upload and download.
 BlobEncryptionPolicy policy = new BlobEncryptionPolicy(key, null);

 // Set the encryption policy on the request options.
 BlobRequestOptions options = new BlobRequestOptions() { EncryptionPolicy = policy };

 // Upload the encrypted contents to the blob.
 blob.UploadFromStream(stream, size, null, options, null);

 // Download and decrypt the encrypted contents from the blob.
 MemoryStream outputStream = new MemoryStream();
 blob.DownloadToStream(outputStream, null, options, null);

Warteschlangendienst-VerschlüsselungQueue service encryption

Erstellen Sie ein QueueEncryptionPolicy-Objekt, und legen Sie es in den Anforderungsoptionen fest (über die API oder auf Clientebene mit DefaultRequestOptions).Create a QueueEncryptionPolicy object and set it in the request options (per API or at a client level by using DefaultRequestOptions). Alles Weitere wird intern von der Clientbibliothek behandelt.Everything else will be handled by the client library internally.

// Create the IKey used for encryption.
 RsaKey key = new RsaKey("private:key1" /* key identifier */);

 // Create the encryption policy to be used for upload and download.
 QueueEncryptionPolicy policy = new QueueEncryptionPolicy(key, null);

 // Add message
 QueueRequestOptions options = new QueueRequestOptions() { EncryptionPolicy = policy };
 queue.AddMessage(message, null, null, options, null);

 // Retrieve message
 CloudQueueMessage retrMessage = queue.GetMessage(null, options, null);

TabellendienstverschlüsselungTable service encryption

Zusätzlich zum Erstellen einer Verschlüsselungsrichtlinie und zum Festlegen der Richtlinie für die Anforderungsoptionen müssen Sie entweder einen EncryptionResolver in TableRequestOptions angeben oder das [EncryptProperty]-Attribut für die Entität festlegen.In addition to creating an encryption policy and setting it on request options, you must either specify an EncryptionResolver in TableRequestOptions, or set the [EncryptProperty] attribute on the entity.

Verwenden des ResolversUsing the resolver

// Create the IKey used for encryption.
 RsaKey key = new RsaKey("private:key1" /* key identifier */);

 // Create the encryption policy to be used for upload and download.
 TableEncryptionPolicy policy = new TableEncryptionPolicy(key, null);

 TableRequestOptions options = new TableRequestOptions()
 {
    EncryptionResolver = (pk, rk, propName) =>
     {
        if (propName == "foo")
         {
            return true;
         }
         return false;
     },
     EncryptionPolicy = policy
 };

 // Insert Entity
 currentTable.Execute(TableOperation.Insert(ent), options, null);

 // Retrieve Entity
 // No need to specify an encryption resolver for retrieve
 TableRequestOptions retrieveOptions = new TableRequestOptions()
 {
    EncryptionPolicy = policy
 };

 TableOperation operation = TableOperation.Retrieve(ent.PartitionKey, ent.RowKey);
 TableResult result = currentTable.Execute(operation, retrieveOptions, null);

Verwenden von AttributenUsing attributes

Wenn die Entität "TableEntity" implementiert, können die Eigenschaften, wie bereits erwähnt, mit dem [EncryptProperty]-Attribut ergänzt werden, statt den EncryptionResolveranzugeben.As mentioned above, if the entity implements TableEntity, then the properties can be decorated with the [EncryptProperty] attribute instead of specifying the EncryptionResolver.

[EncryptProperty]
 public string EncryptedProperty1 { get; set; }

Verschlüsselung und LeistungEncryption and performance

Beachten Sie, dass ein Verschlüsseln Ihrer Storage-Daten einen zusätzlichen Leistungsaufwand verursacht.Note that encrypting your storage data results in additional performance overhead. Der Inhaltsschlüssel und der IV müssen generiert, der Inhalt selbst muss verschlüsselt, und zusätzliche Metadaten müssen formatiert und hochgeladen werden.The content key and IV must be generated, the content itself must be encrypted, and additional meta-data must be formatted and uploaded. Dieser Aufwand variiert abhängig von der Menge der zu verschlüsselnden Daten.This overhead will vary depending on the quantity of data being encrypted. Es empfiehlt sich, dass Kunden ihre Anwendungen während der Entwicklung immer hinsichtlich der Leistung testen.We recommend that customers always test their applications for performance during development.

Nächste SchritteNext steps