在JavaScript中加密大型文件&;高效地存储在S3中
我有一个UI,它使用预先签名的URL(从服务器获取预先签名的URL)将文件上传到s3。它工作得非常好,除了现在需要在上面再添加一层加密(以防存储桶被错误的策略暴露) 我知道有很多方法可以在JavaScript层使用非对称密钥进行加密,但似乎我必须在内存中完全读取文件,然后进行加密并发送。因此,如果我上传1GB,它将使浏览器/选项卡崩溃 那么有没有一种有效的方法来解决这个问题呢?我现在只需要使用在JavaScript中加密大型文件&;高效地存储在S3中,javascript,angularjs,encryption,amazon-s3,Javascript,Angularjs,Encryption,Amazon S3,我有一个UI,它使用预先签名的URL(从服务器获取预先签名的URL)将文件上传到s3。它工作得非常好,除了现在需要在上面再添加一层加密(以防存储桶被错误的策略暴露) 我知道有很多方法可以在JavaScript层使用非对称密钥进行加密,但似乎我必须在内存中完全读取文件,然后进行加密并发送。因此,如果我上传1GB,它将使浏览器/选项卡崩溃 那么有没有一种有效的方法来解决这个问题呢?我现在只需要使用$httpangular服务来上传文件。它能够独立处理1GB的文件——它似乎在内部将文件分解成块并发送出
$http
angular服务来上传文件。它能够独立处理1GB的文件——它似乎在内部将文件分解成块并发送出去
我不知道如何模仿我自己的块行为。我可以使用File.slice()
读取零件并加密。但是,预签名的url将作为单个实体上载。下一部分将仅替换第一部分。不确定如何将多部分上传与预签名URL相结合
我还想知道是否有任何方法可以截获$http
服务发送的数据块,对正文进行加密,然后再让它们离开
如果没有选择,我只能简单地将文件上传到服务器端,加密并将其推送到S3
getCredentials
函数获取tmp凭据function getCredentials() {
return new Promise((resolve, reject) => {
const cognitoIdentityPoolId = 'us-east-1:xxxxxxxx';
let cognitoIdentityId = '';
AWS.config.region = 'us-east-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: cognitoIdentityPoolId
});
AWS.config.credentials.get(err => {
if (err) {
reject(err);
}
cognitoIdentityId = AWS.config.credentials.identityId;
let cognitoidentity = new AWS.CognitoIdentity();
cognitoidentity.getCredentialsForIdentity({
IdentityId: cognitoIdentityId
}, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data.Credentials);
}
});
});
});
}
getCredentials
函数获取tmp凭据function getCredentials() {
return new Promise((resolve, reject) => {
const cognitoIdentityPoolId = 'us-east-1:xxxxxxxx';
let cognitoIdentityId = '';
AWS.config.region = 'us-east-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: cognitoIdentityPoolId
});
AWS.config.credentials.get(err => {
if (err) {
reject(err);
}
cognitoIdentityId = AWS.config.credentials.identityId;
let cognitoidentity = new AWS.CognitoIdentity();
cognitoidentity.getCredentialsForIdentity({
IdentityId: cognitoIdentityId
}, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data.Credentials);
}
});
});
});
}
我问了这个问题,假设我可以使用公钥加密来加密大文件。我看到一些字符串在JS中使用公钥进行加密,因此假设我可以复制一个大文件的逻辑 事实证明,使用公钥/私钥加密大文件是不可行的。它首先需要一个巨大的密钥本身&/或者去加密(即使是分块的)会很耗时 因此,最后我遵循了行业惯例,即生成一个对称密钥&加密对象,然后使用公共密钥加密对称密钥。这就证明了AWS和AWS:kms数据键的作用
一旦我决定使用对称密钥,我就无法在JS层中使用。我把它推到了服务器上。将文件传输到服务器&然后再传输到S3并不像我所感觉的那样慢 我问了这个问题,假设我可以使用公钥加密来加密大文件。我看到一些字符串在JS中使用公钥进行加密,因此假设我可以复制一个大文件的逻辑 事实证明,使用公钥/私钥加密大文件是不可行的。它首先需要一个巨大的密钥本身&/或者去加密(即使是分块的)会很耗时 因此,最后我遵循了行业惯例,即生成一个对称密钥&加密对象,然后使用公共密钥加密对称密钥。这就证明了AWS和AWS:kms数据键的作用
一旦我决定使用对称密钥,我就无法在JS层中使用。我把它推到了服务器上。将文件传输到服务器&然后再传输到S3并不像我所感觉的那样慢 您是否使用了多部分更新?我简单地探索了一下。但是,要使用SDK,我们需要凭据,对吗?我知道我们可以获得通过的临时凭据,但这并不像一个签名的url那样安全,它将上传限制为一个(动态)密钥。我在很多地方见过AWSIngonito,但没有检查。最好的使用方法是什么@您是否使用了多部分更新?我简单地探索了一下。但是,要使用SDK,我们需要凭据,对吗?我知道我们可以获得通过的临时凭据,但这并不像一个签名的url那样安全,它将上传限制为一个(动态)密钥。我在很多地方见过AWSIngonito,但没有检查。最好的使用方法是什么@你能提供更多关于科尼托的信息吗?似乎它将添加登录功能?一个注册的、使用过的、登录过的用户有他/她的会话令牌来执行AWS任务吗?你能提供更多关于Cognito的信息吗?似乎它将添加登录功能?一个注册的、使用过的、登录过的用户有他/她的会话令牌来执行AWS任务吗?你有没有找到合适的解决方案?使用非对称密钥加密大文件是不可行的。密钥本身的长度会变大。你有没有找到合适的解决方案?使用非对称密钥加密大文件是不可行的。钥匙本身的长度会变大。