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

迁移至Azure Blob Storage时无法生成有效CustomerProvidedEncryptionKey咨询

解决方案

问题根源

你对key_hash的计算逻辑、以及参数传入类型两处存在错误:

  1. Azure要求key_hash是原始密钥的SHA256二进制摘要的Base64编码,你错误使用了hexdigest()得到十六进制字符串后再编码,导致值不符合要求
  2. 接口要求传入的是字符串类型的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:15:05