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

PHP cURL上传加密文件至云存储报SHA256密钥哈希无效400错误

PHP cURL 上传GCS加密文件报密钥哈希无效错误修复方案

错误原因

返回customerEncryptionKeySha256IsInvalid是因为x-goog-encryption-key-sha256请求头的计算不符合GCS接口规范,存在两处逻辑错误:

  • 哈希计算入参错误:当前代码对base64编码后的密钥字符串做SHA256计算,GCS要求必须对未编码的32字节原始二进制密钥计算SHA256
  • 哈希结果编码错误:代码直接传入hash()默认返回的十六进制字符串,GCS要求该字段必须传入二进制哈希值经base64编码后的结果
    另外代码中密钥变量名存在拼写错误($encryptioinKey正确拼写为$encryptionKey),不影响运行但建议修正。

修复方式

将原代码中计算哈希的行:

$hash = hash('SHA256', $encryptioinKey);

替换为:

// 第三个参数设为true返回原始二进制哈希结果,再做base64编码
$hash = base64_encode(hash('SHA256', $key, true));

修正后完整代码

<?php
$ch = curl_init();
$image = file_get_contents('2.jpg');
// 生成AES256要求的32字节原始密钥,逻辑正确无需修改
$key = random_bytes(32);
$encryptionKey = base64_encode($key);
// 修正后的哈希计算逻辑
$hash = base64_encode(hash('SHA256', $key, true));
$BUCKET_NAME= "XXXXX";
$oauth_token= "XXXX";
curl_setopt($ch, CURLOPT_URL, "https://storage.googleapis.com/upload/storage/v1/b/".$BUCKET_NAME."/o?uploadType=media&name=2.jpg");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $image ); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: image/jpeg',
    'Authorization: Bearer ' . $oauth_token,
    'x-goog-encryption-algorithm: AES256',
    'x-goog-encryption-key: '. $encryptionKey,
    'x-goog-encryption-key-sha256: '.$hash
));
$result = curl_exec($ch);
// 增加cURL错误捕获,方便排查后续可能出现的网络类问题
if (curl_errno($ch)) {
    print_r(curl_error($ch));
}
curl_close($ch);
echo "<pre>";print_r($result);die();
?>

注意事项

  • 原有代码中x-goog-encryption-key字段的计算逻辑正确,无需调整
  • 随机生成的加密密钥请自行妥善留存,GCS不存储用户自行提供的加密密钥,密钥丢失后对应加密文件无法解密恢复
  • 密钥与密钥哈希必须一一对应,不匹配时会直接返回400错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:21:32