curl加密上传文件至云存储返回400密钥错误问题排查
问题定位
携带加密头返回400错误的核心原因是x-goog-encryption-key-sha256请求头取值不符合云存储服务客户侧加密的参数格式规范,鉴权、接口路径、密钥本身、上传逻辑均无异常(无加密头可正常上传可佐证这一点)。
云存储客户侧加密三个请求头的校验规则如下:
x-goog-encryption-algorithm:固定传AES256,你的配置符合要求x-goog-encryption-key:需传入32位原始AES256密钥的base64编码值,你通过random_bytes(32)生成密钥再base64编码的逻辑正确,传入的密钥长度、格式均符合要求x-goog-encryption-key-sha256:需传入原始二进制格式的密钥SHA256哈希值的base64编码,你当前传入的是哈希值的十六进制字符串,完全不符合格式要求,直接触发参数校验失败,返回密钥不合法的报错。
你的PHP密钥生成代码存在明确逻辑错误:PHP内置hash()函数默认第三个参数为false,返回结果是哈希值的十六进制小写字符串(长度64字符),和接口要求的「原始二进制哈希base64编码」(长度约44字符,末尾带=补位)格式完全不匹配。
修复方案
仅需修改PHP代码中哈希值的生成逻辑,给hash()函数传入第三个参数true获取原始二进制哈希结果,再对该结果做base64编码即可:
$key = random_bytes(32); $encodedKey = base64_encode($key); // 第三个参数设为true返回原始二进制哈希,再进行base64编码 $hash = base64_encode(hash('SHA256', $key, true));
验证说明
使用修正后生成的$encodedKey和$hash值替换curl请求中对应的两个加密头,即可正常完成加密文件上传。你当前请求中传入的ca2f7dac23426d0ba16911be8911f9b71b1fa7f9ecc53ac87100932677d92319是典型的十六进制哈希串,长度64位,和接口要求的44位左右base64编码值特征明显不符,替换为正确生成的值即可解决问题。
内容的提问来源于stack exchange,提问作者kameshwar
相关产品推荐
相关产品推荐

