2016-09-24 93 views
2

我正在研究一個將圖像存儲在Google雲端存儲(GCS)中的項目。我使用下面的代碼運行NodeJS服務器。使用簽名的URL將文件發送到服務器,以便在GCS中恢復可上載。拋光整個文件後,服​​務器將請求發送到該地址。Google雲端存儲似乎忽略客戶提供的加密密鑰標題

該部分工作。但是,當我向請求中添加指定customer-supplied encryption key的標頭時,GCS將忽略它們。上傳完成,返回200,並應用默認加密密鑰。

當我嘗試了一個無效值x-goog-encryption-algorithm,其中我應該已得到400,它上傳罰款。

我應該非常接近,但是我錯過什麼標題或配置可以指定客戶提供的加密密鑰?

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); 
    }); 
    }); 
}; 

回答

1

對於可恢復的上傳,您需要發送與初始POST相同的加密標頭以創建上傳URL。

+1

這樣做。謝謝! – freeformflow