【问题标题】:Getting signed url from s3 to decrypt uploaded object using SSE-C从 s3 获取签名 url 以使用 SSE-C 解密上传的对象
【发布时间】:2017-09-07 18:06:34
【问题描述】:

我成功地使用以下 sn-p 加密和上传图像文件:

var ssecKey = '12345678901234567890123456789012'

var data = {
    Key: 'testfolder/abc.png', 
    Body: buffer,
    ContentEncoding: 'base64',
    ContentType: 'image/png',
    SSECustomerAlgorithm: 'AES256',
    SSECustomerKey: ssecKey
};

s3.putObject(data, (err) => {
    if (err) return console.error(err.stack)

    s3.getSignedUrl('getObject', {
        Key: 'testfolder/abc.png', 
        Expires: 160,
        SSECustomerAlgorithm: 'AES256',
        SSECustomerKey: ssecKey
    }, (err, data) => {
        if (err) return console.error(err.stack)

        console.log(data);
    });
});

为了取回解密后的对象,我使用了 getsignedurl 方法,控制台输出一个签名的 url 但没有解密图像,因此在浏览器上显示以下错误:

我可能在这里做错了什么。

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 aws-sdk


    【解决方案1】:

    让它使用 getObject 而不是 getSignedUrl。

    我认为不使用 getSignedUrl 方法返回解密数据是有道理的。由于使用 getSignedUrl,密钥将在 url 中以纯文本而不是在标头中传递,如果密钥可通过网络读取,这将减少加密的使用。

    以下适用于字节数组中的解密对象:

        s3.getObject({
            Key: 'testfolder/abc.png',
            SSECustomerAlgorithm: 'AES256',
            SSECustomerKey: ssecKey
        }, function (err, data) {
            if (err) {
                console.error(err);
            }
            else {
                console.log('BYTE ARRAY: ' + data.Body);
                console.log('BASE64: ' + data.Body.toString('base64'));
            }
        });
    

    【讨论】:

      【解决方案2】:

      根据https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property的文档:

      注意:

      使用预签名 URL 时,并非所有操作参数都受支持。 某些参数,例如 SSECustomerKey、ACL、Expires、 发送内容时,必须将 ContentLength 或 Tagging 作为标头提供 要求。如果您使用预签名 URL 从浏览器上传,并且 需要使用这些字段,请参见 createPresignedPost()。

      你需要这样的代码:

      在后台:

      AWS.config.update({
        accessKeyId: process.env.AWS_ACCESS_KEY_ID,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
        region: process.env.AWS_REGION,
        signatureVersion: 'v4' // NB! this seems needed to avoid some bugs
      })
      s3.getSignedUrl('getObject', {
            Bucket: process.env.S3_BUCKET_NAME,
            Key: key,
            SSECustomerAlgorithm: 'AES256', // NB! this must be added
          })
      

      在浏览器中:

      //encryption key can be generated in nodejs:
      //var password = "some easy to remember password";
      //var encryption_key = crypto.createHash('sha256').update(password, 'utf8').digest('base64');
      //var encryption_key_md5 = crypto.createHash('md5').update(encryption_key, 'base64').digest('base64');
      
      function presigned_get(url) {
        console.log("presigned_get", url);
        var xhr = new XMLHttpRequest();
        xhr.responseType = 'blob';
        xhr.open("get", url);
        xhr.setRequestHeader("x-amz-server-side-encryption-customer-algorithm", "AES256");
        xhr.setRequestHeader("x-amz-server-side-encryption-customer-key", ENCRYPTION_KEY);
        //xhr.setRequestHeader("x-amz-server-side-encryption-customer-key-MD5", ENCRYPTION_KEY_MD5);
        xhr.send();
        xhr.onload = function() {
          if (xhr.status == 200) {
            console.log(`Downloaded ${url}`);
            var filename = url.substring(0, url.indexOf('?'));
            filename = filename.substring(filename.lastIndexOf('/')+1);
            window.saveAs(xhr.response, filename);
          } else {
            var reader = new FileReader();
            reader.readAsText(xhr.response);
            reader.addEventListener('loadend', (e) => {
              console.error(`Downloading ${url} failed:`, xhr.statusText, e.srcElement.result);
            });
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 2017-02-15
        • 2021-02-15
        • 2012-02-22
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多