你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 .NET 在对 Blob 存储的请求中指定客户提供的密钥

对 Azure Blob 存储发出请求的客户端可以选择在单个请求中提供 AES-256 加密密钥。 在请求中包含加密密钥可以精细控制 Blob 存储操作的加密设置。 客户提供的密钥可以存储在 Azure Key Vault 或其他密钥存储中。

本文介绍如何使用 .NET 在请求中指定客户提供的密钥。

安装客户端库包

注意

本文中的示例使用 Azure 存储客户端库版本 12。 版本 12 的客户端库是 Azure SDK 的一部分。 有关 Azure SDK 的更多信息,请参阅 GitHub 上的 Azure SDK 存储库。

若要安装 Blob 存储包,请在 NuGet 包管理器控制台中运行以下命令:

Install-Package Azure.Storage.Blobs

本文中的示例还使用用于 .NET 的 Azure 标识客户端库的最新版通过 Microsoft Entra 凭据进行身份验证。 若要安装包,请在 NuGet 包管理器控制台中运行以下命令:

Install-Package Azure.Identity

若要详细了解如何使用 Azure 标识客户端库进行身份验证,请参阅用于 .NET 的 Azure 标识客户端库

使用客户提供的密钥写入到 Blob

下面的示例在使用用于 blob 存储的 v12 客户端库上传 blob 时提供了 AES-256 密钥。 该示例使用 DefaultAzureCredential 对象授权 Microsoft Entra ID 的写入请求,但也可以使用共享密钥凭据授权该请求。 有关使用 DefaultAzureCredential 类授权托管标识访问 Azure 存储的详细信息,请参阅适用于 .NET 的 Azure 标识客户端库

async static Task UploadBlobWithClientKey(Uri blobUri,
                                          Stream data,
                                          byte[] key,
                                          string keySha256)
{
    // Create a new customer-provided key.
    // Key must be AES-256.
    var cpk = new CustomerProvidedKey(key);

    // Check the key's encryption hash.
    if (cpk.EncryptionKeyHash != keySha256)
    {
        throw new InvalidOperationException("The encryption key is corrupted.");
    }

    // Specify the customer-provided key on the options for the client.
    BlobClientOptions options = new BlobClientOptions()
    {
        CustomerProvidedKey = cpk
    };

    // Create the client object with options specified.
    BlobClient blobClient = new BlobClient(
        blobUri,
        new DefaultAzureCredential(),
        options);

    // If the container may not exist yet,
    // create a client object for the container.
    // The container client retains the credential and client options.
    BlobContainerClient containerClient =
        blobClient.GetParentBlobContainerClient();

    try
    {
        // Create the container if it does not exist.
        await containerClient.CreateIfNotExistsAsync();

        // Upload the data using the customer-provided key.
        await blobClient.UploadAsync(data);
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

后续步骤