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
相关产品推荐
相关产品推荐

