SDK di crittografia AWS per Java - AWS Encryption SDK

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à.

SDK di crittografia AWS per Java

In questo argomento viene descritto come installare e utilizzare SDK di crittografia AWS per Java. Per dettagli sulla programmazione con SDK di crittografia AWS per Java, consulta il aws-encryption-sdk-javarepository su GitHub. Per API la documentazione, consulta Javadoc per. SDK di crittografia AWS per Java

Prerequisiti

Prima di installare SDK di crittografia AWS per Java, assicurati di avere i seguenti prerequisiti.

Un ambiente di sviluppo Java

È necessario Java 8 o versioni successive. Sul sito Web di Oracle, accedete a Java SE Downloads, quindi scaricate e installate il Java SE Development Kit (JDK).

Se utilizzi OracleJDK, devi anche scaricare e installare Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.

Bouncy Castle

SDK di crittografia AWS per Java Richiede Bouncy Castle.

  • SDK di crittografia AWS per Java le versioni 1.6.1 e successive utilizzano Bouncy Castle per serializzare e deserializzare oggetti crittografici. È possibile utilizzare Bouncy Castle o Bouncy Castle per soddisfare questo requisito. FIPS Per informazioni sull'installazione e la configurazione di Bouncy CastleFIPS, consulta la FIPSdocumentazione di BC, in particolare le Guide per l'utente e la politica di sicurezza. PDFs

  • Le versioni precedenti SDK di crittografia AWS per Java utilizzano la crittografia di Bouncy Castle per Java. API Questo requisito è soddisfatto solo da chi non è Bouncy Castle. FIPS

Se non hai Bouncy Castle, vai alle ultime versioni di Bouncy Castle per scaricare il file del provider corrispondente al tuo. JDK Puoi anche usare Apache Maven per ottenere l'artefatto per il provider standard di Bouncy Castle (bcprov-ext-jdk15on) o l'artefatto per Bouncy Castle (bc-fips). FIPS

AWS SDK for Java

Versione 3. x of the SDK di crittografia AWS per Java richiede AWS SDK for Java 2.x, anche se non si utilizzano AWS KMS portachiavi.

Versione 2. x o precedente di SDK di crittografia AWS per Java non richiede AWS SDK for Java. Tuttavia, AWS SDK for Java è necessario utilizzare AWS Key Management Service(AWS KMS) come fornitore di chiavi principali. A partire dalla SDK di crittografia AWS per Java versione 2.4.0, SDK di crittografia AWS per Java supporta sia la versione 1.x che la 2.x di. AWS SDK for Java AWS Encryption SDK il codice per AWS SDK for Java 1.x e 2.x è interoperabile. Ad esempio, è possibile crittografare i dati con AWS Encryption SDK codice che supporta AWS SDK for Java 1.x e decrittografarli utilizzando codice che supporta (o viceversa). AWS SDK for Java 2.x Le versioni precedenti alla 2.4.0 supportano SDK di crittografia AWS per Java solo la versione 1.x. AWS SDK for Java Per informazioni sull'aggiornamento della versione di in uso AWS Encryption SDK, vedere. Migrazione della tuaAWS Encryption SDK

Quando aggiorni il SDK di crittografia AWS per Java codice dalla versione AWS SDK for Java 1.x alla versione 1.x AWS SDK for Java 2.x, sostituisci i riferimenti all'AWSKMSinterfaccia nella versione AWS SDK for Java 1.x con i riferimenti all'KmsClientinterfaccia in. AWS SDK for Java 2.xNon SDK di crittografia AWS per Java supporta l'interfaccia. KmsAsyncClient Inoltre, aggiorna il codice per utilizzare gli oggetti AWS KMS correlati allo spazio dei kmssdkv2 nomi nel namespace, anziché nel namespace. kms

Per installare, usa Apache Maven AWS SDK for Java.

Per ulteriori modifiche, consulta Cosa c'è di diverso tra AWS SDK for Java 1.x e 2.x nella AWS SDK for Java 2.x Developer Guide.

Gli esempi di Java nella AWS Encryption SDK Developer Guide utilizzano il. AWS SDK for Java 2.x

Installazione

Installa la versione più recente di SDK di crittografia AWS per Java.

Nota

Tutte le versioni SDK di crittografia AWS per Java precedenti alla 2.0.0 sono in fase di sviluppo. end-of-support

È possibile eseguire l'aggiornamento in tutta sicurezza dalla versione 2.0. x e versioni successive alla versione più recente di SDK di crittografia AWS per Java senza modifiche al codice o ai dati. Tuttavia, nella versione 2.0 sono state introdotte nuove funzionalità di sicurezza. x non sono retrocompatibili. Per eseguire l'aggiornamento da versioni precedenti alla 1.7. x alla versione 2.0. x e versioni successive, è necessario prima eseguire l'aggiornamento alla versione più recente 1. versione x di AWS Encryption SDK. Per informazioni dettagliate, consultare Migrazione della tuaAWS Encryption SDK.

È possibile installarlo SDK di crittografia AWS per Java nei seguenti modi.

Manualmente

Per installare SDK di crittografia AWS per Java, clona o scarica il aws-encryption-sdk-java GitHubrepository.

Utilizzo di Apache Maven

SDK di crittografia AWS per Java è disponibile tramite Apache Maven con la seguente definizione di dipendenza.

<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-encryption-sdk-java</artifactId> <version>3.0.0</version> </dependency>

Dopo aver installatoSDK, inizia a guardare il codice Java di esempio in questa guida e Javadoc attivo. GitHub

AWS KMS portachiavi in SDK di crittografia AWS per Java

versione 3. x of the SDK di crittografia AWS per Java utilizza i portachiavi per eseguire la crittografia delle buste. I AWS KMS portachiavi di base della serie SDK di crittografia AWS per Java richiedono una sola chiave. KMS Richiedono anche un AWS KMS client, che ti dà l'opportunità di configurare il client per la Regione AWS KMS chiave.

Per creare un AWS KMS portachiavi con una o più chiavi avvolgenti, usa un portachiavi multiplo. SDK di crittografia AWS per Java Ha uno speciale portachiavi multiplo che accetta una o più AWS KMS chiavi e un portachiavi multiplo standard che accetta uno o più portachiavi di qualsiasi tipo supportato. Alcuni programmatori preferiscono utilizzare un metodo con più portachiavi per creare tutti i loro portachiavi e supportano questa strategia. SDK di crittografia AWS per Java

SDK di crittografia AWS per Java Fornisce portachiavi di base a chiave singola e portachiavi multipla per tutti i casi d'uso tipici, comprese le chiavi multiregionali. AWS KMS

Ad esempio, per creare un AWS KMS portachiavi con una sola AWS KMS chiave, è possibile utilizzare il metodo]. CreateAwsKmsKeyring()

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); // Create the keyring CreateAwsKmsKeyringInput kmsKeyringInput = CreateAwsKmsKeyringInput.builder() .kmsKeyId(keyArn) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsKeyringInput);

Per creare un portachiavi con una o più AWS KMS chiavi, utilizzate il CreateAwsKmsMultiKeyring() metodo. Questo esempio utilizza due KMS chiavi. Per specificare una KMS chiave, utilizzate solo il generator parametro. Il msKeyIds parametro che specifica le KMS chiavi aggiuntive è facoltativo.

L'input per questo portachiavi non richiede un AWS KMS client. AWS Encryption SDK Utilizza invece il AWS KMS client predefinito per ogni regione rappresentato da una KMS chiave nel portachiavi. Ad esempio, se la KMS chiave identificata dal valore del Generator parametro si trova nella regione () degli Stati Uniti occidentali (Oregonus-west-2), AWS Encryption SDK crea un AWS KMS client predefinito per la us-west-2 regione. Se è necessario personalizzare il AWS KMS client, utilizzare il CreateAwsKmsKeyring() metodo.

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<String> additionalKey = Collections.singletonList("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"); // Create the keyring final CreateAwsKmsMultiKeyringInput keyringInput = CreateAwsKmsMultiKeyringInput.builder() .generator(generatorKey) .kmsKeyIds(additionalKey) .build(); final IKeyring kmsKeyring = materialProviders.CreateAwsKmsMultiKeyring(keyringInput);

SDK di crittografia AWS per Java supporta AWS KMS portachiavi che utilizzano la crittografia simmetrica (SYMMETRIC_DEFAULT) o chiavi asimmetriche. RSA KMS AWS KMS i portachiavi creati con chiavi asimmetriche possono contenere solo una coppia di RSA KMS chiavi.

Per crittografare con un RSA AWS KMS portachiavi asimmetrico, non hai bisogno di kms: GenerateDataKey o KMS:Encrypt perché devi specificare il materiale della chiave pubblica che desideri utilizzare per la crittografia quando crei il portachiavi. Non vengono effettuate chiamate durante la crittografia con questo portachiavi. AWS KMS Per decrittografare con un portachiavi asimmetrico RSA AWS KMS , è necessaria l'autorizzazione KMS:Decrypt.

Per creare un portachiavi asimmetrico, devi fornire la chiave pubblica e la chiave privata della tua RSA AWS KMS chiave asimmetrica. ARN RSA KMS La chiave pubblica deve essere codificata. PEM L'esempio seguente crea un AWS KMS portachiavi con una coppia di chiavi asimmetricaRSA.

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder() // Specify algorithmSuite without asymmetric signing here // // ALG_AES_128_GCM_IV12_TAG16_NO_KDF("0x0014"), // ALG_AES_192_GCM_IV12_TAG16_NO_KDF("0x0046"), // ALG_AES_256_GCM_IV12_TAG16_NO_KDF("0x0078"), // ALG_AES_128_GCM_IV12_TAG16_HKDF_SHA256("0x0114"), // ALG_AES_192_GCM_IV12_TAG16_HKDF_SHA256("0x0146"), // ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA256("0x0178") .withEncryptionAlgorithm(CryptoAlgorithm.ALG_AES_256_GCM_IV12_TAG16_HKDF_SHA256) .build(); final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); // Create a KMS RSA keyring. // This keyring takes in: // - kmsClient // - kmsKeyId: Must be an ARN representing an asymmetric RSA KMS key // - publicKey: A ByteBuffer of a UTF-8 encoded PEM file representing the public // key for the key passed into kmsKeyId // - encryptionAlgorithm: Must be either RSAES_OAEP_SHA_256 or RSAES_OAEP_SHA_1 final CreateAwsKmsRsaKeyringInput createAwsKmsRsaKeyringInput = CreateAwsKmsRsaKeyringInput.builder() .kmsClient(KmsClient.create()) .kmsKeyId(rsaKeyArn) .publicKey(publicKey) .encryptionAlgorithm(EncryptionAlgorithmSpec.RSAES_OAEP_SHA_256) .build(); IKeyring awsKmsRsaKeyring = matProv.CreateAwsKmsRsaKeyring(createAwsKmsRsaKeyringInput);

Contesti di crittografia richiesti nella versione 3.x

Con la versione 3. x di SDK di crittografia AWS per Java, è possibile utilizzare il contesto di crittografia richiesto CMM per richiedere contesti di crittografia nelle operazioni crittografiche. Un contesto di crittografia è un insieme di coppie chiave-valore non segrete. Il contesto di crittografia è associato crittograficamente ai dati crittografati in modo che sia necessario lo stesso contesto di crittografia per decrittografare il campo. Quando si utilizza il contesto di crittografia richiestoCMM, è possibile specificare una o più chiavi del contesto di crittografia richieste (chiavi obbligatorie) che devono essere incluse in tutte le chiamate di crittografia e decrittografia.

Nota

Il contesto di crittografia richiesto CMM è supportato solo dalle seguenti versioni:

  • Versione 3. x del SDK di crittografia AWS per Java

  • Versione 4. x del AWS Encryption SDK modulo. NET

  • Versione 4. x di SDK di crittografia AWS per Python, se utilizzato con la dipendenza opzionale Cryptographic Material Providers Library (MPL).

Se si crittografano i dati utilizzando il contesto di crittografia richiestoCMM, è possibile decrittografarli solo con una di queste versioni supportate.

Durante la crittografia, AWS Encryption SDK verifica che tutte le chiavi del contesto di crittografia richieste siano incluse nel contesto di crittografia specificato. Segna AWS Encryption SDK i contesti di crittografia specificati. Solo le coppie chiave-valore che non sono chiavi richieste vengono serializzate e archiviate in testo semplice nell'intestazione del messaggio crittografato restituito dall'operazione di crittografia.

In decrypt, è necessario fornire un contesto di crittografia che contenga tutte le coppie chiave-valore che rappresentano le chiavi richieste. AWS Encryption SDK Utilizza questo contesto di crittografia e le coppie chiave-valore memorizzate nell'intestazione del messaggio crittografato per ricostruire il contesto di crittografia originale specificato nell'operazione di crittografia. Se AWS Encryption SDK non è possibile ricostruire il contesto di crittografia originale, l'operazione di decrittografia ha esito negativo. Se si fornisce una coppia chiave-valore che contiene la chiave richiesta con un valore errato, il messaggio crittografato non può essere decrittografato. È necessario fornire la stessa coppia chiave-valore specificata in encrypt.

Importante

Valuta attentamente i valori che scegli per le chiavi richieste nel tuo contesto di crittografia. Devi essere in grado di fornire nuovamente le stesse chiavi e i valori corrispondenti al momento di decrypt. Se non riesci a riprodurre le chiavi richieste, il messaggio crittografato non può essere decrittografato.

L'esempio seguente inizializza un AWS KMS portachiavi con il contesto di crittografia richiesto. CMM

// Instantiate the AWS Encryption SDK final AwsCrypto crypto = AwsCrypto.builder() .withCommitmentPolicy(CommitmentPolicy.RequireEncryptRequireDecrypt) .build(); // Create your encryption context final Map<String, String> encryptionContext = new HashMap<>(); encryptionContext.put("encryption", "context"); encryptionContext.put("is not", "secret"); encryptionContext.put("but adds", "useful metadata"); encryptionContext.put("that can help you", "be confident that"); encryptionContext.put("the data you are handling", "is what you think it is"); // Create a list of required encryption contexts final List<String> requiredEncryptionContextKeys = Arrays.asList("encryption", "context"); // Create the keyring final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsKeyringInput keyringInput = CreateAwsKmsKeyringInput.builder() .kmsKeyId(keyArn) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(keyringInput); // Create the required encryption context CMM ICryptographicMaterialsManager cmm = materialProviders.CreateDefaultCryptographicMaterialsManager( CreateDefaultCryptographicMaterialsManagerInput.builder() .keyring(kmsKeyring) .build() ); ICryptographicMaterialsManager requiredCMM = materialProviders.CreateRequiredEncryptionContextCMM( CreateRequiredEncryptionContextCMMInput.builder() .requiredEncryptionContextKeys(requiredEncryptionContextKeys) .underlyingCMM(cmm) .build() );