You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用Azure Key Vault密钥加密Azure Blob报错如何解决

问题原因
  • 密钥获取逻辑错误:你当前从Azure Key Vault获取的是RSA非对称密钥的公钥模数(keyvaultObj.key.n),该值是RSA密钥的组件而非符合要求的AES对称密钥,AES密钥要求长度为16/24/32字节,RSA模数长度通常为256/512字节,不符合长度要求因此抛出错误。
  • 密钥包装实现缺失:你自定义的KeyWrapper类没有实现Azure存储客户端加密要求的wrap_key、unwrap_key方法,且直接将RSA密钥组件作为密钥加密密钥(KEK)使用,RSA与AES的加密逻辑不兼容,无法完成内容加密密钥(CEK)的包装操作。
  • 所用SDK已废弃:你使用的BlockBlobService属于已停止维护的azure-storage-blob v2.x版本SDK,该版本原生不支持Azure Key Vault密钥对接,需要自行实现大量适配逻辑,容易出现兼容性问题。
解决方案

方案1:适配现有代码(不推荐)

如果你需要继续使用v2版本SDK,可以按以下要求修改:

  1. 在Azure Key Vault中创建对称密钥(类型为oct),密钥长度设置为128/192/256位(对应16/24/32字节),符合AES密钥长度要求。
  2. 修改密钥获取逻辑,获取对称密钥的原始值:
def get_azure_vault_key(self):
    credential = DefaultAzureCredential()
    key_client = KeyClient(vault_url="https://xyz.vault.azure.net/", credential=credential)
    keyvaultObj = key_client.get_key("my-aes-key")
    # 对称oct密钥的k字段为原始密钥字节
    return keyvaultObj.key.k
  1. 补全KeyWrapper类的wrap_key和unwrap_key方法,实现AES密钥包装逻辑。

方案2:使用新版SDK实现(推荐)

升级到azure-storage-blob v12.x版本,配合azure-keyvault-keys、azure-identity官方包,无需自行实现密钥包装逻辑,示例代码如下:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
from azure.keyvault.keys import KeyClient
from azure.keyvault.keys.crypto import CryptographyClient

# 初始化Key Vault客户端获取密钥
credential = DefaultAzureCredential()
key_client = KeyClient(vault_url="https://xyz.vault.azure.net/", credential=credential)
kek = key_client.get_key("my-key")
# 初始化加密客户端
crypto_client = CryptographyClient(kek, credential=credential)

# 初始化Blob客户端,开启客户端加密
blob_service_client = BlobServiceClient(
    account_url="https://<你的存储账户名>.blob.core.windows.net",
    credential=credential,
    # 配置客户端加密参数
    client_side_encryption_options={
        "key_resolver": lambda kid: crypto_client,
        "key_encryption_key": kek,
        "encryption_algorithm": "RSA-OAEP-256"
    }
)

# 上传加密Blob
blob_client = blob_service_client.get_blob_client(container="你的容器名", blob="myBlob.csv")
blob_client.upload_blob(CSVData, overwrite=True)

如果使用存储账户密钥认证,将credential参数替换为AzureKeyCredential("你的存储账户密钥")即可。

内容的提问来源于stack exchange,提问作者Atul Takekar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:18:01