Google 云存储似乎忽略了客户提供的加密密钥 Headers

Google Cloud Storage Appears to Ignore Customer Supplied Encryption Key Headers

我正在开展一个将图像存储在 Google 云存储 (GCS) 中的项目。我是 运行 具有以下代码的 NodeJS 服务器。文件被发送到带有签名 URL 的服务器,以便在 GCS 中恢复上传。抛光整个文件后,服​​务器将请求定向到该地址。

这部分有效。但是,当我将 headers 添加到指定 customer-supplied encryption key 的请求时,GCS 会忽略它们。上传完成,returns一个200,并应用默认加密密钥。

当我尝试 x-goog-encryption-algorithm 的无效值时,我 应该 得到 400,它上传正常。

我应该非常接近,但是我缺少什么 header 或配置允许指定 customer-supplied 加密密钥?

var crypto = require("crypto");
var fs = require("fs");
var Request = require("request");

var hashKey = function(key) {
  var hash = crypto.createHash("sha256");
  key = new Buffer(key);
  hash.update(key);
  return hash.digest("base64");
};

var GCS = module.exports = function GCS(env) {
  // config contains the encryption key I'd like to specify.
  this.config = env.config
};

GCS.prototype.upload = function (url, buffer) {
  var self = this;
  return new Promise(function(resolve, reject) {
    var headers = { 
      "Content-Length": buffer.size,
      "x-goog-encryption-algorithm": "AES256",
      "x-goog-encryption-key": self.config.encryption.key, 
      "x-goog-encryption-key-sha256": hashKey(self.config.encryption.key)
    };

    var options = {
      url: url,
      method: "PUT",
      headers: headers
    };

    fs.createReadStream(buffer.path)
    .pipe(Request(options))
    .on("error", function(e) {
      self.logger.error("Failed to upload asset to slot.", e);
      reject(e);
    })
    .on("response", function(res){
      if (res.statusCode != 200) {
        reject(new Error("Unexpected response code" + res));
      }
      resolve(res);
     });
  });
};

对于可续传上传,您需要发送与创建上传 URL.

的初始 POST 相同的加密 headers