2017-08-12 10 views
1

私は、署名済みのURLを使用してファイルをs3にアップロードするUIを持っています(サーバから事前に署名されたURLを取得します)。これは非常にうまく動作しますが、もう1層の暗号化レイヤーを追加する必要があります(誤ったポリシーによってバケツが公開された場合)。JavaScriptで大きなファイルを暗号化しS3で効率的に保存する

私は非対称キーを使用してJavaScriptレイヤーで暗号化する方法があることを理解していますが、メモリ内のファイルを完全に読み取って暗号化して送信したようです。したがって、1GBをアップロードすると、ブラウザ/タブがクラッシュします。

これは効率的な方法ですか?私は今、$http角度サービスを使ってファイルをアップロードしています。それは1GBのファイルを単独で扱うことができます。内部的にファイルを塊に分割して&を送信しているようです。

私はチャンクの動作を自分でエミュレートする方法がわかりませんでした。私は部分&を読むためにFile.slice()を使うことができます。ただし、事前に署名されたURLは、それを単一のエンティティとしてアップロードします。次の部分は最初の部分だけを置き換えます。事前に署名されたURLと複数の部分のアップロードを組み合わせる方法が不明です。

$httpサービスが送信したチャンクを傍受して、本体を暗号化してからもう一度手をつないでもいいのかと疑問に思っていましたか?

オプションがない場合は、単純にファイルをサーバー側にアップロードして、&をS3にプッシュする必要があります。

+0

マルチパート更新を使用しましたか? http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createMultipartUpload-property –

+0

私は簡単に調査しました。しかし、SDKを使用するには資格が必要です。一時的な資格情報を渡すことができますが、それは1つの(動的な)鍵だけにアップロードを制限する署名されたURLほど安全ではありません。私はAWSIngonitoが多くの場所で言及されているのを見てきましたが、チェックしませんでした。それを使用する最良の方法は何ですか? @D。Dimitrioglo – Vineet

答えて

0

を私は大きなファイルを公開鍵暗号化を使って暗号化できると仮定して質問します。公開鍵を使用してJSで暗号化された文字列がいくつか見られたため、大きなファイルのロジックを複製することができます。

大きなファイルを公開鍵/秘密鍵で暗号化することは実現不可能です。それは、最初に巨大な鍵そのものを必要とするでしょう(またはチャンクされていても)de/encryptに時間がかかります。

最後に、私は、対称鍵&を生成して、そのオブジェクトを暗号化し、次に私の公開鍵を使って暗号化するという業界の慣習に従いました。 AWSがaws:kmsデータキーと一緒にやっていることが分かります。

対称キーを使用するようになったら、JSレイヤーではできませんでした。私はそれをすべてサーバーに押し込んだ。ファイルをサーバ&に転送してから再びS3に転送することは、私が知覚するほど遅くはありません。

0
  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); 
     } 
     }); 
    }); 
    }); 
} 
+0

Cognitoに関する詳細情報を提供できますか?それはログイン機能を追加するようですか?登録されたユーザは、いったんログインしてAWSタスクを実行するためのセッショントークンを持っていますか? – Vineet

関連する問題