繁体   English   中英

使用JavaScript加密大文件并有效存储在S3中

[英]Encrypting large files in JavaScript & storing in S3 efficiently

我有一个UI,该UI使用预签名的url(从服务器获取预签名的url)将文件上传到s3。 它工作得很好,除了现在需要在顶部再增加一层加密(以防错误的策略暴露了存储桶)。

我知道有一些方法可以使用非对称密钥在JavaScript层进行加密,但是似乎我必须完全在内存中读取文件,然后加密然后发送。 因此,如果我上传1GB,它将导致浏览器/标签页崩溃。

那么有没有一种有效的方法来解决这个问题? 我现在只使用$http angular服务上传文件。 它能够自己处理1GB的文件-似乎在内部将文件分解为大块并发送出去。

我不确定如何独自模仿该行为。 我可以利用File.slice()读取零件并进行加密。 但是,预签名的url将其作为单个实体上载。 下一部分将仅替换第一部分。 不确定如何将分段上传与预先签名的网址结合使用。

我还想知道是否有任何方法可以拦截$http服务发出的块,对主体进行加密,然后再让它们走?

如果没有选项,我将不得不退一步,仅将文件上传到服务器端,加密并将其推送到S3。

  1. 创建Cognito身份池
  2. 使用tmp凭证获取getCredentials函数
  3. 使用aws-sdk库和createMultipartUpload方法

功能示例:

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的速度没有我想象的那么慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM