迁移至Azure Blob Storage时无法生成有效CustomerProvidedEncryptionKey咨询
解决方案
问题根源
你对key_hash的计算逻辑、以及参数传入类型两处存在错误:
- Azure要求
key_hash是原始密钥的SHA256二进制摘要的Base64编码,你错误使用了hexdigest()得到十六进制字符串后再编码,导致值不符合要求 - 接口要求传入的是字符串类型的Base64编码结果,你直接传入了bytes类型,也会触发头部校验失败
正确生成步骤
- 生成32字节长度的AES-256原始密钥,生产环境请使用密码学安全的随机生成方式,不要使用固定字符串
- 对原始密钥计算SHA256哈希,直接取二进制结果(调用
digest()而非hexdigest()) - 分别将原始密钥、SHA256二进制哈希做Base64编码,转成UTF-8字符串后传入接口
修正后代码片段
import hashlib import base64 from azure.storage.blob import ( ContainerClient, CustomerProvidedEncryptionKey, ) local_file_name = "sample.txt" target_file_name = "sample-encrypted.txt" container_name = "test" connection_str = "<redacted>" # 生成32字节AES256密钥,生产环境建议用os.urandom(32)生成安全随机密钥 key_value = b"32byteslongsecretkeyshallbegiven" # 直接取SHA256二进制摘要,不要转十六进制 key_hash_raw = hashlib.sha256(key_value).digest() # 分别做Base64编码后转UTF-8字符串 key_value_encoded = base64.b64encode(key_value).decode('utf-8') key_hash_encoded = base64.b64encode(key_hash_raw).decode('utf-8') # 构造CPK对象 cpk = CustomerProvidedEncryptionKey(key_value_encoded, key_hash_encoded) # 后续上传逻辑不变 container_client = ContainerClient.from_connection_string( connection_str, container_name=container_name, ) with open(local_file_name, "rb") as data: container_client.upload_blob( data=data, name=target_file_name, overwrite=True, cpk=cpk )
补充说明
SHA256算法的原始二进制输出固定为32字节,Base64编码后正好是44字符长度,和官方测试用例的密钥、哈希长度一致,完全符合接口校验要求。
内容的提问来源于stack exchange,提问作者Senarii
相关产品推荐
相关产品推荐

