gpt4 book ai didi

javascript - Amazon S3 客户端加密 Javascript

转载 作者:行者123 更新时间:2023-11-27 23:53:44 25 4
gpt4 key购买 nike

尝试让 Amazon S3 客户端加密与 Javascript 一起使用。

Establishing SSE for a particular S3 object within a bucket is optional and can easily be established at the individual object level. A "blanket" policy can also be set that requires all data sent to S3 buckets to be encrypted. A sample of such a policy is as follows:

{
"Version":"2013-05-17",
"Id":"PutObjPolicy",
"Statement":[{
"Sid":"DenyUnEncryptedObjectUploads",
"Effect":"Deny",
"Principal":{
"AWS":"*"
},
"Action":"s3:PutObject",
"Resource":"arn:aws:s3:::SensitiveBucket/*",
"Condition":{
"StringNotEquals":{
"s3:x-amz-server-side-encryption":"AES256"
}
}
}
]
}

To successfully place any data into this S3 bucket, the request would need to include the "x-amz-server-side-encryption" header.

由于它是客户端,我得到了这个 json 策略设置:

{
"expiration": "2020-01-01T00:00:00Z",
"conditions": [
{"bucket": "angular-file-upload"},
["starts-with", "$key", ""],
{"acl": "private"},
{ "x-amz-server-side-encryption": "AES256"},
{"x-amz-server-side​-encryption​-customer-key": "ABC1234835784375349754857893"},
{"x-amz-server-side​-encryption​-customer-key-MD5": "d0259989a64a9234457dbc51d5202c24"},
["starts-with", "$Content-Type", ""],
["starts-with", "$filename", ""],
["content-length-range", 0, 524288000]
]
}

将文件 COR 方式发送到 S3 (POST),并在上传期间另外发送 x-amz-server-side-encryption header 。

尝试了两种 json 策略,但它们都抛出相同的结果。

响应如下:

    <Error><Code>AccessDenied</Code>
<Message>Invalid according to Policy: Extra input fields: x-amz-server-side​-encryption​-customer-key</Message><RequestId>...</RequestId><HostId>...</HostId></Error>

有人知道这是怎么回事吗?最近我什至好奇是否有可能使用 JS 和 Cors 加密客户端。

干杯。

最佳答案

通过在创建的策略和 Base64 编码以及在 AJAX 请求中发送的表单数据中包含 x-amz-server-side-encryption,我能够摆脱此警告。

政策:

            var s3Policy = {
"expiration": formatted,
"conditions": [
{ "bucket": "MYBUCKET" },
{ "acl": config.acl },
{ "x-amz-server-side-encryption": "AES256" },
[ "eq", "$key", path],
[ "eq", "$Content-Type", mimetype ],
[ "content-length-range", 0, maxSize ],
]
};

表单发布数据:

            data.params = {
key: path,
AWSAccessKeyId: key,
acl: acl,
Policy: base64Policy,
Signature: signature,
"Content-Type": mimetype,
"x-amz-server-side-encryption": "AES256",
},

为了完整起见,我还有以下 CORS 配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
<AllowedHeader>Content-Type</AllowedHeader>
<AllowedHeader>x-amz-acl</AllowedHeader>
<AllowedHeader>origin</AllowedHeader>
</CORSRule>
</CORSConfiguration>

和存储桶策略(强制需要加密):

{
"Version": "2012-10-17",
"Id": "Policy1447114958606",
"Statement": [
{
"Sid": "Stmt1447114951553",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::MYBUCKET/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
}
]
}

我的代码实际将文件发布到 s3,看起来像这样,但它将取决于您选择使用的库和包装器:

    // Build the form data (this is what we will eventually post)
var fd = new FormData();
if (data.params)
{
for (var prop in data.params) {
if (data.params.hasOwnProperty(prop)) {
fd.append(prop,data.params[prop]);
}
}
}
fd.append('file', file);

// Post data
var deferred = $q.defer();
var req = $.ajax({
type: 'POST',
url: data.url,
data: fd,
cache: false,
contentType: false,
processData: false,
success: function(response, textStatus, jqXHR) { deferred.resolve(response); },
error: function(jqXHR, textStatus, errorThrown) { deferred.reject(errorThrown || "Upload failed, try again"); },
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) myXhr.upload.addEventListener('progress', function (progress) { deferred.notify(progress); }, false);
return myXhr;
}
});
var promise = deferred.promise;
promise.cancel = function()
{
req.abort();
deferred.reject("Cancelled");
};
return promise;

关于javascript - Amazon S3 客户端加密 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com