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,可以按以下要求修改:
- 在Azure Key Vault中创建对称密钥(类型为oct),密钥长度设置为128/192/256位(对应16/24/32字节),符合AES密钥长度要求。
- 修改密钥获取逻辑,获取对称密钥的原始值:
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
- 补全
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
相关产品推荐
相关产品推荐

