Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizzo della crittografia lato server con chiavi fornite dal cliente (-C) SSE
La crittografia lato server consente di proteggere i dati inattivi. La crittografia lato server viene applicata solo ai dati dell'oggetto, non dei metadati dell'oggetto. Utilizzando la crittografia lato server con chiavi fornite dal cliente (SSE-C), è possibile archiviare i dati crittografati con le proprie chiavi di crittografia. Con la chiave di crittografia fornita come parte della richiesta, Amazon S3 gestisce la crittografia dei dati durante le operazioni di scrittura su disco e decrittografia dei dati quando viene eseguito l'accesso agli oggetti. Pertanto, non è necessario mantenere alcun codice per effettuare la crittografia e la decrittografia dei dati. L'unica cosa che rimane da fare è gestire le chiavi di crittografia fornite.
Quando carichi un oggetto, Amazon S3 utilizza la chiave di crittografia che fornisci per applicare la crittografia AES -256 ai tuoi dati. Amazon S3 rimuove quindi la chiave di crittografia dalla memoria. Quando viene recuperato un oggetto, è necessario fornire la stessa chiave di crittografia come parte della richiesta. Amazon S3 verifica prima che la chiave di crittografia fornita corrisponda, quindi esegue la decrittografia dell'oggetto prima di restituire i relativi dati.
Non sono previsti costi aggiuntivi per l'utilizzo SSE di -C. Tuttavia, le richieste di configurazione e utilizzo di SSE -C comportano costi di richiesta Amazon S3 standard. Per informazioni sui prezzi, consulta Prezzi di Amazon S3.
Amazon S3 non archivia le chiavi di crittografia fornite. Memorizza invece un valore Message Authentication Code (HMAC) basato su Hash salato in modo casuale della chiave di crittografia per convalidare le richieste future. Il HMAC valore salato non può essere utilizzato per derivare il valore della chiave di crittografia o per decrittografare il contenuto dell'oggetto crittografato. Ciò significa che se si perde la chiave di crittografia, si perde l'oggetto.
S3 Replication supporta oggetti crittografati con -C. SSE Per ulteriori informazioni sulla replica di oggetti crittografati, consulta. Replica di oggetti crittografati (SSE-S3, -, -, -C) SSE KMS DSSE KMS SSE
Per ulteriori informazioni su SSE -C, vedere i seguenti argomenti.
SSEPanoramica su -C
Questa sezione fornisce una panoramica di SSE -C. Quando usi SSE -C, tieni a mente le seguenti considerazioni.
-
Devi utilizzare HTTPS.
Amazon S3 rifiuta qualsiasi richiesta effettuata utilizzando -CHTTP. SSE Per motivi di sicurezza, ti consigliamo di considerare compromessa qualsiasi chiave inviata erroneamente. HTTP Elimina la chiave ed esegui la rotazione come opportuno.
-
Il tag entity (ETag) nella risposta non è l'MD5hash dei dati dell'oggetto.
-
L'utente gestisce una mappatura per tenere traccia della chiave di crittografia che è stata utilizzata per crittografare un determinato oggetto. Amazon S3 non archivia le chiavi di crittografia. L'utente è responsabile della tracciatura di ciascuna chiave di crittografia fornita per ogni determinato oggetto.
-
Se per il bucket in uso è abilitata la funzione di controllo delle versioni, ogni versione di oggetto caricata utilizzando questa caratteristica può avere la propria chiave di crittografia. L'utente è responsabile della tracciatura di ciascuna chiave di crittografia utilizzata per ogni determinato oggetto.
-
Dato che l'utente gestisce le chiavi di crittografia lato cliente, gestisce anche eventuali tutele aggiuntive, come la rotazione delle chiavi, lato cliente.
Se la chiave di crittografia viene smarrita, qualsiasi richiesta GET
di un determinato oggetto senza la rispettiva chiave di crittografia non va a buon fine e l'oggetto viene perduto.
Richiedere e limitare SSE -C
Per richiedere SSE -C per tutti gli oggetti in un particolare bucket Amazon S3, puoi utilizzare una policy bucket.
Ad esempio, la seguente policy sui bucket nega le autorizzazioni di upload object (s3:PutObject
) per tutte le richieste che non includono l'intestazione che richiede -C. x-amz-server-side-encryption-customer-algorithm
SSE
{
"Version": "2012-10-17",
"Id": "PutObjectPolicy",
"Statement": [
{
"Sid": "RequireSSECObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket
/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption-customer-algorithm": "true"
}
}
}
]
}
Per limitare la crittografia lato server di tutti gli oggetti in uno specifico bucket Amazon S3, è anche possibile utilizzare una policy. Ad esempio, la seguente policy sui bucket nega l'autorizzazione di upload object (s3:PutObject
) a tutti se la richiesta include l'intestazione che richiede -C. x-amz-server-side-encryption-customer-algorithm
SSE
{
"Version": "2012-10-17",
"Id": "PutObjectPolicy",
"Statement": [
{
"Sid": "RestrictSSECObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket
/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption-customer-algorithm": "false"
}
}
}
]
}
Se utilizzi una policy bucket per richiedere l'attivazione di SSE -Cs3:PutObject
, devi includere l'x-amz-server-side-encryption-customer-algorithm
intestazione in tutte le richieste di caricamento in più parti (, e). CreateMultipartUpload UploadPart CompleteMultipartUpload
Presigned e -C URLs SSE
È possibile generare un predefinito URL che può essere utilizzato per operazioni come il caricamento di un nuovo oggetto, il recupero di un oggetto esistente o il recupero dei metadati dell'oggetto. Supporto predefinito -C come segue: URLs SSE
-
Quando si crea un predefinitoURL, è necessario specificare l'algoritmo utilizzando l'x-amz-server-side-encryption-customer-algorithm
intestazione nel calcolo della firma.
-
Quando si utilizza il prefirmato URL per caricare un nuovo oggetto, recuperare un oggetto esistente o recuperare solo i metadati dell'oggetto, è necessario fornire tutte le intestazioni di crittografia nella richiesta dell'applicazione client.
Per non-SSE-C gli oggetti, potete generare un predefinito URL e incollarlo direttamente URL in un browser per accedere ai dati.
Tuttavia, non è possibile eseguire questa operazione per gli oggetti SSE -C, poiché oltre ai predefinitiURL, è necessario includere anche HTTP intestazioni specifiche degli oggetti -C. SSE Pertanto, è possibile utilizzare presigned URLs for SSE -C solo a livello di programmazione.
Per ulteriori informazioni su presigned, vedere. URLs Scarica e carica oggetti con presigned URLs
Specificazione della crittografia lato server con chiavi fornite dal cliente (-C) SSE
Al momento della creazione dell'oggetto con RESTAPI, è possibile specificare la crittografia lato server con chiavi fornite dal cliente (-C). SSE Quando si utilizza SSE -C, è necessario fornire informazioni sulla chiave di crittografia utilizzando le seguenti intestazioni di richiesta.
Nome |
Descrizione |
x-amz-server-side-encryption-customer-algorithm
|
Utilizzare questa intestazione per specificare l'algoritmo di crittografia. Il valore dell'intestazione deve essere AES256 .
|
x-amz-server-side-encryption-customer-key
|
Utilizzare questa intestazione per fornire la chiave di crittografia a 256 bit codificata con base64 per consentire ad Amazon S3 di crittografare o decrittare i dati.
|
x-amz-server-side-encryption-customer-key-MD5
|
Utilizzate questa intestazione per fornire il digest a 128 bit MD5 con codifica Base64 della chiave di crittografia secondo 1321. RFC Amazon S3 utilizza questa intestazione per il controllo dell'integrità del messaggio per accertarsi che la chiave di crittografia sia stata trasmessa senza errori.
|
Puoi usare le librerie AWS SDK wrapper per aggiungere queste intestazioni alla tua richiesta. Se necessario, puoi effettuare le REST API chiamate Amazon S3 direttamente nella tua applicazione.
Non è possibile utilizzare la console Amazon S3 per caricare un oggetto e richiedere SSE -C. Inoltre, non è possibile utilizzare la console per aggiornare (ad esempio, modificare la classe di archiviazione o aggiungere metadati) un oggetto esistente memorizzato utilizzando -C. SSE
Amazon S3 resto APIs che supporta -C SSE
I seguenti Amazon S3 APIs supportano la crittografia lato server con chiavi di crittografia fornite dal cliente (-C). SSE
-
GEToperazione: quando recuperi oggetti utilizzando GET API (vedi GETObject), puoi specificare le intestazioni della richiesta.
-
HEADoperazione — Per recuperare i metadati degli oggetti utilizzando HEAD API (vedi HEADOggetto), puoi specificare queste intestazioni di richiesta.
-
PUToperazione — Quando si caricano dati utilizzando l'PUToggetto API (vedi PUTOggetto), è possibile specificare queste intestazioni di richiesta.
-
Caricamento in più parti: quando si caricano oggetti di grandi dimensioni utilizzando il caricamento in più partiAPI, è possibile specificare queste intestazioni. È necessario specificare queste intestazioni nella richiesta di avvio (consulta l'argomento relativo all'avvio di caricamenti in più parti) e in ogni richiesta di caricamento di parti successive (consulta l'argomento relativo al caricamento delle parti o caricamento delle copie di parti). Per ogni richiesta di caricamento di parte, le informazioni della crittografia devono essere uguali a quelle specificate nella richiesta di avvio di caricamento in più parti.
-
POSToperazione: quando si utilizza un'POSToperazione per caricare un oggetto (vedi POSTOggetto), anziché le intestazioni della richiesta, si forniscono le stesse informazioni nei campi del modulo.
-
Operazione di copia — Quando copi un oggetto (vedi PUTOggetto - Copia), hai sia un oggetto di origine che un oggetto di destinazione:
-
Se si desidera crittografare l'oggetto di destinazione utilizzando la crittografia lato server con chiavi AWS gestite, è necessario fornire l'intestazione della x-amz-server-side-encryption
richiesta.
-
Se si desidera crittografare l'oggetto di destinazione utilizzando SSE -C, è necessario fornire informazioni di crittografia utilizzando le tre intestazioni descritte nella tabella precedente.
-
Se l'oggetto sorgente è crittografato utilizzando SSE -C, è necessario fornire le informazioni sulla chiave di crittografia utilizzando le seguenti intestazioni in modo che Amazon S3 possa decrittografare l'oggetto per la copia.
Nome |
Descrizione |
x-amz-copy-source-server-side-encryption-customer-algorithm
|
Includere questa intestazione per specificare l'algoritmo che dovrebbe utilizzare Amazon S3 per decrittare l'oggetto di origine. Questo valore deve essere AES256 .
|
x-amz-copy-source-server-side-encryption-customer-key
|
Includere questa intestazione per fornire la chiave di crittografia codificata con base64 per consentire ad Amazon S3 di decrittare l'oggetto di origine. Questa chiave di crittografia deve essere quella fornita ad Amazon S3 quando è stato creato l'oggetto di origine. In caso contrario, Amazon S3 non riesce a decrittare l'oggetto.
|
x-amz-copy-source-server-side-encryption-customer-key-MD5
|
Includi questa intestazione per fornire il digest a 128 bit con codifica Base64 della chiave di crittografia secondo la norma 1321. MD5 RFC
|
Gli esempi seguenti mostrano come richiedere la crittografia lato server con chiavi fornite dal cliente (-C) per gli oggetti. SSE Negli esempi vengono eseguite le operazioni riportate di seguito. Ogni operazione mostra come specificare SSE-C-related le intestazioni nella richiesta:
-
Put object: consente di caricare un oggetto e richiedere la crittografia lato server utilizzando la chiave di crittografia fornita dal cliente.
-
Get object: consente di scaricare l'oggetto caricato durante la fase precedente. Nella richiesta, vengono fornite le stesse informazioni di crittografia specificate quando è stato caricato l'oggetto. per consentire ad Amazon S3 di decrittare l'oggetto e di restituirlo.
-
Get object metadata: consente di recuperare i metadati dell'oggetto. Fornire le stesse informazioni di crittografia utilizzate quando l'oggetto è stato creato.
-
Copy object: consente di creare una copia dell'oggetto caricato in precedenza. Poiché l'oggetto di origine è archiviato utilizzando SSE -C, è necessario fornire le relative informazioni di crittografia nella richiesta di copia. Per impostazione predefinita, Amazon S3 esegue la crittografia dell'oggetto solo se richiesta esplicitamente. In questo esempio, Amazon S3 viene configurato per archiviare una copia crittografata dell'oggetto.
- Java
-
In questo esempio viene illustrato come caricare un oggetto in un'unica operazione. Quando si utilizza il Multipart API Upload per caricare oggetti di grandi dimensioni, si forniscono informazioni di crittografia nello stesso modo illustrato in questo esempio. Per esempi di caricamenti in più parti che utilizzano il AWS SDK for Java, consulta. Caricamento di un oggetto utilizzando il caricamento in più parti
Per aggiungere le informazioni di crittografia richieste, includere SSECustomerKey
nella richiesta. Per ulteriori informazioni sulla SSECustomerKey
classe, consultate la REST API sezione.
Per informazioni su SSE -C, vedereUtilizzo della crittografia lato server con chiavi fornite dal cliente (-C) SSE. Per istruzioni su come creare e testare un esempio funzionante, consulta Getting Started nella AWS SDK for Java Developer Guide.
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import javax.crypto.KeyGenerator;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class ServerSideEncryptionUsingClientSideEncryptionKey {
private static SSECustomerKey SSE_KEY;
private static AmazonS3 S3_CLIENT;
private static KeyGenerator KEY_GENERATOR;
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "*** Bucket name ***";
String keyName = "*** Key name ***";
String uploadFileName = "*** File path ***";
String targetKeyName = "*** Target key name ***";
// Create an encryption key.
KEY_GENERATOR = KeyGenerator.getInstance("AES");
KEY_GENERATOR.init(256, new SecureRandom());
SSE_KEY = new SSECustomerKey(KEY_GENERATOR.generateKey());
try {
S3_CLIENT = AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider())
.withRegion(clientRegion)
.build();
// Upload an object.
uploadObject(bucketName, keyName, new File(uploadFileName));
// Download the object.
downloadObject(bucketName, keyName);
// Verify that the object is properly encrypted by attempting to retrieve it
// using the encryption key.
retrieveObjectMetadata(bucketName, keyName);
// Copy the object into a new object that also uses SSE-C.
copyObject(bucketName, keyName, targetKeyName);
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
private static void uploadObject(String bucketName, String keyName, File file) {
PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSECustomerKey(SSE_KEY);
S3_CLIENT.putObject(putRequest);
System.out.println("Object uploaded");
}
private static void downloadObject(String bucketName, String keyName) throws IOException {
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, keyName).withSSECustomerKey(SSE_KEY);
S3Object object = S3_CLIENT.getObject(getObjectRequest);
System.out.println("Object content: ");
displayTextInputStream(object.getObjectContent());
}
private static void retrieveObjectMetadata(String bucketName, String keyName) {
GetObjectMetadataRequest getMetadataRequest = new GetObjectMetadataRequest(bucketName, keyName)
.withSSECustomerKey(SSE_KEY);
ObjectMetadata objectMetadata = S3_CLIENT.getObjectMetadata(getMetadataRequest);
System.out.println("Metadata retrieved. Object size: " + objectMetadata.getContentLength());
}
private static void copyObject(String bucketName, String keyName, String targetKeyName)
throws NoSuchAlgorithmException {
// Create a new encryption key for target so that the target is saved using
// SSE-C.
SSECustomerKey newSSEKey = new SSECustomerKey(KEY_GENERATOR.generateKey());
CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, keyName, bucketName, targetKeyName)
.withSourceSSECustomerKey(SSE_KEY)
.withDestinationSSECustomerKey(newSSEKey);
S3_CLIENT.copyObject(copyRequest);
System.out.println("Object copied");
}
private static void displayTextInputStream(S3ObjectInputStream input) throws IOException {
// Read one line at a time from the input stream and display each line.
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println();
}
}
- .NET
-
Per informazioni su SSE -C, vedere. Utilizzo della crittografia lato server con chiavi fornite dal cliente (-C) SSE Per informazioni sulla configurazione e l'esecuzione degli esempi di codice, consulta Getting Started with the AWS SDK for. NETnella AWS SDKforma. NETGuida per gli sviluppatori.
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Threading.Tasks;
namespace Amazon.DocSamples.S3
{
class SSEClientEncryptionKeyObjectOperationsTest
{
private const string bucketName = "*** bucket name ***";
private const string keyName = "*** key name for new object created ***";
private const string copyTargetKeyName = "*** key name for object copy ***";
// Specify your bucket region (an example region is shown).
private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
private static IAmazonS3 client;
public static void Main()
{
client = new AmazonS3Client(bucketRegion);
ObjectOpsUsingClientEncryptionKeyAsync().Wait();
}
private static async Task ObjectOpsUsingClientEncryptionKeyAsync()
{
try
{
// Create an encryption key.
Aes aesEncryption = Aes.Create();
aesEncryption.KeySize = 256;
aesEncryption.GenerateKey();
string base64Key = Convert.ToBase64String(aesEncryption.Key);
// 1. Upload the object.
PutObjectRequest putObjectRequest = await UploadObjectAsync(base64Key);
// 2. Download the object and verify that its contents matches what you uploaded.
await DownloadObjectAsync(base64Key, putObjectRequest);
// 3. Get object metadata and verify that the object uses AES-256 encryption.
await GetObjectMetadataAsync(base64Key);
// 4. Copy both the source and target objects using server-side encryption with
// a customer-provided encryption key.
await CopyObjectAsync(aesEncryption, base64Key);
}
catch (AmazonS3Exception e)
{
Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
}
}
private static async Task<PutObjectRequest> UploadObjectAsync(string base64Key)
{
PutObjectRequest putObjectRequest = new PutObjectRequest
{
BucketName = bucketName,
Key = keyName,
ContentBody = "sample text",
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key
};
PutObjectResponse putObjectResponse = await client.PutObjectAsync(putObjectRequest);
return putObjectRequest;
}
private static async Task DownloadObjectAsync(string base64Key, PutObjectRequest putObjectRequest)
{
GetObjectRequest getObjectRequest = new GetObjectRequest
{
BucketName = bucketName,
Key = keyName,
// Provide encryption information for the object stored in Amazon S3.
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key
};
using (GetObjectResponse getResponse = await client.GetObjectAsync(getObjectRequest))
using (StreamReader reader = new StreamReader(getResponse.ResponseStream))
{
string content = reader.ReadToEnd();
if (String.Compare(putObjectRequest.ContentBody, content) == 0)
Console.WriteLine("Object content is same as we uploaded");
else
Console.WriteLine("Error...Object content is not same.");
if (getResponse.ServerSideEncryptionCustomerMethod == ServerSideEncryptionCustomerMethod.AES256)
Console.WriteLine("Object encryption method is AES256, same as we set");
else
Console.WriteLine("Error...Object encryption method is not the same as AES256 we set");
// Assert.AreEqual(putObjectRequest.ContentBody, content);
// Assert.AreEqual(ServerSideEncryptionCustomerMethod.AES256, getResponse.ServerSideEncryptionCustomerMethod);
}
}
private static async Task GetObjectMetadataAsync(string base64Key)
{
GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest
{
BucketName = bucketName,
Key = keyName,
// The object stored in Amazon S3 is encrypted, so provide the necessary encryption information.
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key
};
GetObjectMetadataResponse getObjectMetadataResponse = await client.GetObjectMetadataAsync(getObjectMetadataRequest);
Console.WriteLine("The object metadata show encryption method used is: {0}", getObjectMetadataResponse.ServerSideEncryptionCustomerMethod);
// Assert.AreEqual(ServerSideEncryptionCustomerMethod.AES256, getObjectMetadataResponse.ServerSideEncryptionCustomerMethod);
}
private static async Task CopyObjectAsync(Aes aesEncryption, string base64Key)
{
aesEncryption.GenerateKey();
string copyBase64Key = Convert.ToBase64String(aesEncryption.Key);
CopyObjectRequest copyRequest = new CopyObjectRequest
{
SourceBucket = bucketName,
SourceKey = keyName,
DestinationBucket = bucketName,
DestinationKey = copyTargetKeyName,
// Information about the source object's encryption.
CopySourceServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
CopySourceServerSideEncryptionCustomerProvidedKey = base64Key,
// Information about the target object's encryption.
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = copyBase64Key
};
await client.CopyObjectAsync(copyRequest);
}
}
}
L'esempio nella sezione precedente mostra come richiedere la crittografia lato server con la chiave fornita dal cliente (SSE-C) nelle operazioni, Head e Copy. PUT GET Questa sezione descrive altri Amazon S3 APIs che supportano SSE -C.
- Java
-
Per caricare oggetti di grandi dimensioni, puoi utilizzare il caricamento in più parti API (vedi). Caricamento e copia di oggetti utilizzando il caricamento in più parti Puoi utilizzare sia il livello alto che quello di basso livello APIs per caricare oggetti di grandi dimensioni. Questi APIs supportano le intestazioni relative alla crittografia nella richiesta.
-
Quando si utilizza il livello elevato TransferManager
API, si forniscono le intestazioni specifiche per la crittografia in (vedi). PutObjectRequest
Caricamento di un oggetto utilizzando il caricamento in più parti
-
Quando si utilizza il livello bassoAPI, si forniscono informazioni relative alla crittografia in, seguite da informazioni di crittografia identiche in ciascuna di esse. InitiateMultipartUploadRequest
UploadPartRequest
Non è necessario fornire alcuna intestazione specifica della crittografia nella CompleteMultipartUploadRequest
. Per alcuni esempi, consulta Usando il (di basso livello AWS SDKs) API.
L'esempio seguente utilizza TransferManager
per creare oggetti e mostra come fornire informazioni SSE relative a -C. Inoltre, vengono effettuate le seguenti operazioni:
-
Viene creato un oggetto utilizzando il metodo TransferManager.upload()
. Nell'istanza PutObjectRequest
, fornire le informazioni sulla chiave di crittografia da richiedere. Amazon S3 esegue la crittografia dell'oggetto utilizzando la chiave fornita dal cliente.
-
Viene eseguita una copia dell'oggetto richiamando il metodo TransferManager.copy()
. Nell'esempio Amazon S3 viene configurato per crittografare la copia dell'oggetto utilizzando una nuova SSECustomerKey
. Poiché l'oggetto di origine è crittografato utilizzando SSE -C, fornisce CopyObjectRequest
anche la chiave di crittografia dell'oggetto di origine in modo che Amazon S3 possa decrittografare l'oggetto prima di copiarlo.
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CopyObjectRequest;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.SSECustomerKey;
import com.amazonaws.services.s3.transfer.Copy;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;
import javax.crypto.KeyGenerator;
import java.io.File;
import java.security.SecureRandom;
public class ServerSideEncryptionCopyObjectUsingHLwithSSEC {
public static void main(String[] args) throws Exception {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "*** Bucket name ***";
String fileToUpload = "*** File path ***";
String keyName = "*** New object key name ***";
String targetKeyName = "*** Key name for object copy ***";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(clientRegion)
.withCredentials(new ProfileCredentialsProvider())
.build();
TransferManager tm = TransferManagerBuilder.standard()
.withS3Client(s3Client)
.build();
// Create an object from a file.
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, keyName, new File(fileToUpload));
// Create an encryption key.
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256, new SecureRandom());
SSECustomerKey sseCustomerEncryptionKey = new SSECustomerKey(keyGenerator.generateKey());
// Upload the object. TransferManager uploads asynchronously, so this call
// returns immediately.
putObjectRequest.setSSECustomerKey(sseCustomerEncryptionKey);
Upload upload = tm.upload(putObjectRequest);
// Optionally, wait for the upload to finish before continuing.
upload.waitForCompletion();
System.out.println("Object created.");
// Copy the object and store the copy using SSE-C with a new key.
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucketName, keyName, bucketName, targetKeyName);
SSECustomerKey sseTargetObjectEncryptionKey = new SSECustomerKey(keyGenerator.generateKey());
copyObjectRequest.setSourceSSECustomerKey(sseCustomerEncryptionKey);
copyObjectRequest.setDestinationSSECustomerKey(sseTargetObjectEncryptionKey);
// Copy the object. TransferManager copies asynchronously, so this call returns
// immediately.
Copy copy = tm.copy(copyObjectRequest);
// Optionally, wait for the upload to finish before continuing.
copy.waitForCompletion();
System.out.println("Copy complete.");
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
}
- .NET
-
Per caricare oggetti di grandi dimensioni, puoi utilizzare il caricamento in più parti (vedi). API Caricamento e copia di oggetti utilizzando il caricamento in più parti AWS SDKper. NETfornisce sia il livello alto che quello basso per caricare oggetti APIs di grandi dimensioni. Questi APIs supportano le intestazioni relative alla crittografia nella richiesta.
-
Quando si utilizza un livello elevato Transfer-Utility
API, si forniscono le intestazioni specifiche per la crittografia come illustrato. TransferUtilityUploadRequest
Per alcuni esempi di codice, consulta Caricamento di un oggetto utilizzando il caricamento in più parti.
TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
{
FilePath = filePath,
BucketName = existingBucketName,
Key = keyName,
// Provide encryption information.
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key
,
};
-
Quando si utilizza il livello bassoAPI, si forniscono informazioni relative alla crittografia nella richiesta di avvio di caricamento multiparte, seguite da informazioni di crittografia identiche nelle richieste di caricamento successive. Non è necessario fornire alcuna intestazione specifica della crittografia nella richiesta di caricamento in più parti completa. Per alcuni esempi, consulta Usando il (di basso livello AWS SDKs) API.
Di seguito è riportato un esempio di caricamento in più parti di basso livello in cui viene creata una copia di un oggetto di grandi dimensioni esistente. Nell'esempio, l'oggetto da copiare viene archiviato in Amazon S3 SSE utilizzando -C e si desidera salvare l'oggetto di destinazione anche utilizzando -C. SSE Nell'esempio, esegui le seguenti operazioni:
-
Viene avviata una richiesta di caricamento in più parti specificando una chiave di crittografia e informazioni correlate.
-
Vengono fornite chiavi di crittografia e informazioni correlate per gli oggetti di origine e di destinazione nella richiesta CopyPartRequest
.
-
Viene ottenuta la dimensione dell'oggetto di origine da copiare recuperando i metadata dell'oggetto.
-
Caricamento degli oggetti in parti da 5 MB
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Threading.Tasks;
namespace Amazon.DocSamples.S3
{
class SSECLowLevelMPUcopyObjectTest
{
private const string existingBucketName = "*** bucket name ***";
private const string sourceKeyName = "*** source object key name ***";
private const string targetKeyName = "*** key name for the target object ***";
private const string filePath = @"*** file path ***";
// Specify your bucket region (an example region is shown).
private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
private static IAmazonS3 s3Client;
static void Main()
{
s3Client = new AmazonS3Client(bucketRegion);
CopyObjClientEncryptionKeyAsync().Wait();
}
private static async Task CopyObjClientEncryptionKeyAsync()
{
Aes aesEncryption = Aes.Create();
aesEncryption.KeySize = 256;
aesEncryption.GenerateKey();
string base64Key = Convert.ToBase64String(aesEncryption.Key);
await CreateSampleObjUsingClientEncryptionKeyAsync(base64Key, s3Client);
await CopyObjectAsync(s3Client, base64Key);
}
private static async Task CopyObjectAsync(IAmazonS3 s3Client, string base64Key)
{
List<CopyPartResponse> uploadResponses = new List<CopyPartResponse>();
// 1. Initialize.
InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
{
BucketName = existingBucketName,
Key = targetKeyName,
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key,
};
InitiateMultipartUploadResponse initResponse =
await s3Client.InitiateMultipartUploadAsync(initiateRequest);
// 2. Upload Parts.
long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB
long firstByte = 0;
long lastByte = partSize;
try
{
// First find source object size. Because object is stored encrypted with
// customer provided key you need to provide encryption information in your request.
GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest()
{
BucketName = existingBucketName,
Key = sourceKeyName,
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key // " * **source object encryption key ***"
};
GetObjectMetadataResponse getObjectMetadataResponse = await s3Client.GetObjectMetadataAsync(getObjectMetadataRequest);
long filePosition = 0;
for (int i = 1; filePosition < getObjectMetadataResponse.ContentLength; i++)
{
CopyPartRequest copyPartRequest = new CopyPartRequest
{
UploadId = initResponse.UploadId,
// Source.
SourceBucket = existingBucketName,
SourceKey = sourceKeyName,
// Source object is stored using SSE-C. Provide encryption information.
CopySourceServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
CopySourceServerSideEncryptionCustomerProvidedKey = base64Key, //"***source object encryption key ***",
FirstByte = firstByte,
// If the last part is smaller then our normal part size then use the remaining size.
LastByte = lastByte > getObjectMetadataResponse.ContentLength ?
getObjectMetadataResponse.ContentLength - 1 : lastByte,
// Target.
DestinationBucket = existingBucketName,
DestinationKey = targetKeyName,
PartNumber = i,
// Encryption information for the target object.
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key
};
uploadResponses.Add(await s3Client.CopyPartAsync(copyPartRequest));
filePosition += partSize;
firstByte += partSize;
lastByte += partSize;
}
// Step 3: complete.
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
{
BucketName = existingBucketName,
Key = targetKeyName,
UploadId = initResponse.UploadId,
};
completeRequest.AddPartETags(uploadResponses);
CompleteMultipartUploadResponse completeUploadResponse =
await s3Client.CompleteMultipartUploadAsync(completeRequest);
}
catch (Exception exception)
{
Console.WriteLine("Exception occurred: {0}", exception.Message);
AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
{
BucketName = existingBucketName,
Key = targetKeyName,
UploadId = initResponse.UploadId
};
s3Client.AbortMultipartUpload(abortMPURequest);
}
}
private static async Task CreateSampleObjUsingClientEncryptionKeyAsync(string base64Key, IAmazonS3 s3Client)
{
// List to store upload part responses.
List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
// 1. Initialize.
InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
{
BucketName = existingBucketName,
Key = sourceKeyName,
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key
};
InitiateMultipartUploadResponse initResponse =
await s3Client.InitiateMultipartUploadAsync(initiateRequest);
// 2. Upload Parts.
long contentLength = new FileInfo(filePath).Length;
long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB
try
{
long filePosition = 0;
for (int i = 1; filePosition < contentLength; i++)
{
UploadPartRequest uploadRequest = new UploadPartRequest
{
BucketName = existingBucketName,
Key = sourceKeyName,
UploadId = initResponse.UploadId,
PartNumber = i,
PartSize = partSize,
FilePosition = filePosition,
FilePath = filePath,
ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256,
ServerSideEncryptionCustomerProvidedKey = base64Key
};
// Upload part and add response to our list.
uploadResponses.Add(await s3Client.UploadPartAsync(uploadRequest));
filePosition += partSize;
}
// Step 3: complete.
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
{
BucketName = existingBucketName,
Key = sourceKeyName,
UploadId = initResponse.UploadId,
//PartETags = new List<PartETag>(uploadResponses)
};
completeRequest.AddPartETags(uploadResponses);
CompleteMultipartUploadResponse completeUploadResponse =
await s3Client.CompleteMultipartUploadAsync(completeRequest);
}
catch (Exception exception)
{
Console.WriteLine("Exception occurred: {0}", exception.Message);
AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
{
BucketName = existingBucketName,
Key = sourceKeyName,
UploadId = initResponse.UploadId
};
await s3Client.AbortMultipartUploadAsync(abortMPURequest);
}
}
}
}