解密 Blob 并将其复制到其他 Blob 存储帐户
本文关键字:Blob 其他 存储 复制 解密 | 更新日期: 2023-09-27 18:34:48
我正在使用这种方法来加密文件并将其存储在 Azure 块 blob 中。我想将加密的 blob 复制到另一个 Blob 存储帐户,并在此过程中对其进行解密。我知道可以执行"复制 blob"操作,该操作完全在 Azure 中异步运行,并且不会在传输过程中通过我的本地计算机下载 blob 内容。我相信这是通过CloudBlockBlob.StartCopy
方法完成的。但是,是否可以使用加密文件并在传输到其他存储帐户时对其进行解密?
按照上面的链接,我的代码如下所示。 blob.OpenRead
有效,但blob2.StartCopy
不起作用。
BlobEncryptionPolicy policy = new BlobEncryptionPolicy(null, cloudResolver);
BlobRequestOptions options = new BlobRequestOptions() { EncryptionPolicy = policy };
CloudBlockBlob blob = container.GetBlockBlobReference("MyFile.txt");
//var blobStream = blob.OpenRead(null, options); //this works
CloudBlockBlob blob2 = container2.GetBlockBlobReference("MyFile2.txt");
blob2.StartCopy(blob, null, null, options, null); //this fails with: The remote server returned an error: (404) Not Found.
答案是加密是在存储客户端库中完成的,因此,如果将 blob 复制到新的存储帐户,它仍将被加密。
代码失败的原因是源 Blob 位于Private
容器中。若要使跨帐户复制正常工作,源 Blob 应可公开访问。在同一存储帐户中,可以从专用容器复制 Blob。AFAIK,该错误与加密无关。
可以执行的操作是在源 Blob 上创建 SAS URL,然后使用以下替代StartCopy
方法:
public string StartCopy(
Uri source,
AccessCondition sourceAccessCondition = null,
AccessCondition destAccessCondition = null,
BlobRequestOptions options = null,
OperationContext operationContext = null
)
下面是执行此操作的示例代码:
private static void StartCopyAcrossAccount()
{
var sourceAccount = new CloudStorageAccount(new StorageCredentials("source-account-name", "source-account-key"), true);
var sourceContainer = sourceAccount.CreateCloudBlobClient().GetContainerReference("source-container");
var sourceBlob = sourceContainer.GetBlockBlobReference("blob-name");
var sourceBlobSas = sourceBlob.GetSharedAccessSignature(new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
Permissions = Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read
});
var sourceBlobSasUrl = sourceBlob.Uri.AbsoluteUri + sourceBlobSas;
var targetAccount = new CloudStorageAccount(new StorageCredentials("target-account-name", "target-account-key"), true);
var targetContainer = targetAccount.CreateCloudBlobClient().GetContainerReference("target-container");
var targetBlob = targetContainer.GetBlockBlobReference("blob-name");
var copyId = targetBlob.StartCopy(new Uri(sourceBlobSasUrl), null, null);
}