AWS S3 Crittografia lato server - Chiavi fornite dal cliente PHP

0

È un po 'strano per me questo non è ancora un argomento comunemente discusso, ma sto lavorando con un server di archiviazione AWS S3 che sta cercando di implementare la crittografia lato server usando l'opzione di una chiave fornita dal cliente (SSE-C).

Ulteriori informazioni qui: link

Il metodo di crittografia funziona perfettamente quando si tenta di utilizzare il servizio di gestione chiavi AWS (KMS). Il problema che ho personalmente è che voglio tenere le chiavi, portandomi così a volere il metodo SSE-C.

La documentazione per PHP (per qualsiasi ragione) è scarsa sotto questo argomento, ma sono riuscito a farlo funzionare usando la build di compositore apparentemente più recente di version3 per S3.

Il mio codice di connessione e mettere oggetto al sistema è il seguente. I file vengono correttamente caricati nel sistema. Il codice è il seguente:

//connect is successful
$client = Aws\S3\S3Client::factory([
    'version' => "2006-03-01",
    'region' => "us-west-1",
    'credentials' => [
        'key'    => "mykey",
        'secret' => "mysecret"
    ]
]);


//upload is successful
$somerandom32bitkey="48wk86271sDb23pY23zT5rZJ7q55R7eE";
$result = $client->putObject([
                'Bucket' => 'mybucketname',
                'Key'    => 'myfilename',
                'Body'   => 'some body of the file',
                'SSECustomerAlgorithm' => 'AES256',               
                'SSECustomerKey'       => $somerandom32bitkey,
                'SSECustomerKeyMD5'    => md5($somerandom32bitkey,true),
            ]);

Il mio problema sorge quando tento di ottenere un URL pre-firmato. Non riesco a trovare alcuna documentazione su come effettivamente fare questa parte che è piuttosto importante. Il codice è il seguente:

$somerandom32bitkey="48wk86271sDb23pY23zT5rZJ7q55R7eE";
    $cmd = $client->getCommand('GetObject', array(
                    'Bucket' => 'mybucketname',
                    'Key'    => 'myfilename',
                    'SSECustomerAlgorithm' => 'AES256',               
                    'SSECustomerKey'       => $somerandom32bitkey,
                    'SSECustomerKeyMD5'    => md5($somerandom32bitkey,true),
                ));

    $request = $client->createPresignedRequest($cmd, '+10 minutes');
    $presignedUrl = (string) $request->getUri();

Il link generato è simile a questo:

collegamento

La risposta al risultato tramite AWS è:

<Error>
<Code>InvalidArgument</Code>
<Message>
Requests specifying Server Side Encryption with Customer provided keys must provide an appropriate secret key.
</Message>
<ArgumentName>x-amz-server-side-encryption</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>933237342E36A1D1</RequestId>
<HostId>
3XmQM+IEGdZUZ5GUnSpTpatksKIN2zb3pCiu8D7Btm09nLxKkfEAkfY8a8T8kcB3lW1p38ic3ZE=
</HostId>
</Error>

La parte interessante è che sta cercando un parametro di: 'ServerSideEncryption' = > 'AES256' ma questo è solo un parametro richiesto quando si utilizza il sistema di chiavi gestite AWS (SSE-KMS) link

Qualche idea qui?

    
posta codin 20.01.2016 - 05:08
fonte

1 risposta

1

Come per documentazione ufficiale ci sono tre richieste di intestazione richieste per SSE con il cliente fornito chiave:

  1. x-amz-server-side -encryption -customer-algorithm: AES256
  2. x-amz-server-side -encryption -customer-key: base64 (secretkey)
  3. x-amz-server-side -encryption -customer-key-MD5: base64 (md5 (segreto chiave))

Aggiorna il codice come sopra

  1. "SSECustomerAlgorithm" = > 'AES256',
  2. "SSECustomerKey" = > base64 ($ somerandom32bitkey)
  3. "SSECustomerKeyMD5 = > md5 (base64 ($ somerandom32bitkey))

Spero che questo ti sia d'aiuto.

    
risposta data 04.10.2016 - 08:16
fonte

Leggi altre domande sui tag