在JavaScript中加密大型文件&;高效地存储在S3中

在JavaScript中加密大型文件&;高效地存储在S3中,javascript,angularjs,encryption,amazon-s3,Javascript,Angularjs,Encryption,Amazon S3,我有一个UI,它使用预先签名的URL(从服务器获取预先签名的URL)将文件上传到s3。它工作得非常好,除了现在需要在上面再添加一层加密(以防存储桶被错误的策略暴露) 我知道有很多方法可以在JavaScript层使用非对称密钥进行加密,但似乎我必须在内存中完全读取文件,然后进行加密并发送。因此,如果我上传1GB,它将使浏览器/选项卡崩溃 那么有没有一种有效的方法来解决这个问题呢?我现在只需要使用$httpangular服务来上传文件。它能够独立处理1GB的文件——它似乎在内部将文件分解成块并发送出

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

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

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

我不知道如何模仿我自己的块行为。我可以使用
File.slice()
读取零件并加密。但是,预签名的url将作为单个实体上载。下一部分将仅替换第一部分。不确定如何将多部分上传与预签名URL相结合

我还想知道是否有任何方法可以截获
$http
服务发送的数据块,对正文进行加密,然后再让它们离开

如果没有选择,我只能简单地将文件上传到服务器端,加密并将其推送到S3

  • 创建Cognito标识池
  • 使用
    getCredentials
    函数获取tmp凭据
  • 使用aws sdk库和方法
  • 功能示例:

    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);
            }
          });
        });
      });
    }
    
  • 创建Cognito标识池
  • 使用
    getCredentials
    函数获取tmp凭据
  • 使用aws sdk库和方法
  • 功能示例:

    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任务吗?你有没有找到合适的解决方案?使用非对称密钥加密大文件是不可行的。密钥本身的长度会变大。你有没有找到合适的解决方案?使用非对称密钥加密大文件是不可行的。钥匙本身的长度会变大。