Clientseitige Verschlüsselung

Das Oracle Cloud Infrastructure-SDK für Python und SDK für Java unterstützen die clientbezogene Verschlüsselung, mit der Ihre Daten auf Clientseite verschlüsselt werden, bevor sie lokal gespeichert oder mit anderen Oracle Cloud Infrastructure-Services verwendet wird.

Standardmäßig generiert das SDK einen eindeutigen Datenschlüssel für jedes Datenobjekt, das es verschlüsselt. Daten werden mit einem sicheren, authentifizierten, symmetrischen AES-/GCM-Schlüsselalgorithmus mit einer 256-Bit-Schlüssellänge verschlüsselt.

Um die clientseitige Verschlüsselung zu verwenden, müssen Sie einen Masterverschlüsselungsschlüssel (Master Encryption Key, MEK) mit dem Key Management-Service erstellen. Dies kann mit CreateKey - oder ImportKey-Vorgängen geschehen.

Mit dem MEK wird ein Datenverschlüsselungsschlüssel (Data Encryption Key, DEK) generiert, um jede Payload zu verschlüsseln. Eine verschlüsselte Kopie dieses DEK (mit dem MEK verschlüsselt) und andere Metadaten werden in die verschlüsselte Payload aufgenommen, die von den SDKs zurückgegeben wird, damit sie zur Entschlüsselung verwendet werden können.

Voraussetzungen für Java

Die unbegrenzten Policy-Dateien für frühere Releases sind nur für JDK 8, 7 und 6 Updates vor 8u161, 7u171 und 6u16 erforderlich. Bei diesen und späteren Versionen sind die Policy-Dateien enthalten, jedoch nicht standardmäßig aktiviert.

Für aktuelle Versionen von JDK sind diese Policy-Dateien nicht erforderlich. Sie werden hier zur Verwendung mit älteren Versionen von JDK bereitgestellt. JDK 9 und höher werden mit unbegrenzten Policy-Dateien geliefert und verwenden diese standardmäßig.

Beispiele

Das folgende Codebeispiel zeigt, wie eine Zeichenfolge verschlüsselt wird:

Java


// String encryption example
			
final byte[] plainText = "Hello World".getBytes();
String masterKeyId = "OCID....";
Map<String, String> context = Collections.singletonMap("Example", "value");
 
OciCrypto ociCrypto = new OciCrypto();
KmsMasterKey kmsMasterKey = new KmsMasterKey(authenticationProvider, Region.US_ASHBURN_1.getRegionId(), vaultId, masterKeyId);
KmsMasterKeyProvider kmsMasterKeyProvider = new KmsMasterKeyProvider(kmsMasterKey);
 
//  Encrypt the data and embed the master key ID in the header
final OciCryptoResult encryptResult = ociCrypto.encryptData(kmsMasterKeyProvider, plainText, context);
final byte[] cipherText = encryptResult.getResult();
 
//  Decrypt the data
final OciCryptoResult decryptResult = ociCrypto.decryptData(kmsMasterKeyProvider, cipherText);

Python

import oci
 
# user supplied vars
vault_id = TEST_VAULT_OCID
master_key_id = TEST_MASTER_KEY_ID
data_to_encrypt_bytes = b"This is a secret message"
 
config = oci.config.from_file()
kms_master_key = oci.encryption.KMSMasterKey(
    config=config, master_key_id=master_key_id, vault_id=vault_id
)
 
kms_master_key_provider = oci.encryption.KMSMasterKeyProvider(
    config=config,
    kms_master_keys=[kms_master_key]
)
 
crypto_result = crypto.encrypt(kms_master_key_provider, data_to_encrypt_bytes)
ciphertext = crypto_result.get_data()
print("ciphertext: {}".format(ciphertext))
 
# decrypt string example
crypto_result = crypto.decrypt(ciphertext, kms_master_key_provider)
print("unencrypted text: {}".format(crypto_result.get_data()))

Die folgenden Beispiele zeigen, wie ein Dateistream verschlüsselt wird:

Java


// Create Encryption file stream
FileInputStream in = new FileInputStream(srcFile);
OciCrypto ociCrypto = new OciCrypto();
KmsMasterKey kmsMasterKey = new KmsMasterKey(authenticationProvider, Region.US_ASHBURN_1.getRegionId(), vaultId, masterKeyId);
KmsMasterKeyProvider kmsMasterKeyProvider = new KmsMasterKeyProvider(kmsMasterKey);
OciCryptoInputStream encryptingStream = ociCrypto.createEncryptingStream(kmsMasterKeyProvider, in);
 
// Write the encrypted data to file
FileOutputStream out = new FileOutputStream(srcFile + ".encrypted");
IOUtils.copy(encryptingStream, out);
encryptingStream.close();
out.close();
 
// For decryption, no need to pass key info
KmsMasterKeyProvider kmsMasterKeyProvider = new KmsMasterKeyProvider(authenticationProvider);
// Create the Decryption file stream.
in = new FileInputStream(srcFile + ".encrypted");
OciCryptoInputStream decryptingStream = ociCrypto.createDecryptingStream(kmsMasterKeyProvider, in);
 
 
// Return the plaintext data
out = new FileOutputStream(srcFile + ".decrypted");
IOUtils.copy(decryptingStream, out);
decryptingStream.close();
out.close();

Python

import oci
import shutil
 
# user supplied vars
vault_id = TEST_VAULT_OCID
master_key_id = TEST_MASTER_KEY_ID
file_to_encrypt = "/file/to/encrypt/message.txt"
output_encrypted_file = "/tmp/message.txt.encrypted"
output_decrypted_file = "/tmp/message.txt.decrypted"
 
# setup OCI KMS keys
config = oci.config.from_file()
kms_master_key = oci.encryption.KMSMasterKey(
    config=config, master_key_id=master_key_id, vault_id=vault_id
)
 
kms_master_key_provider = oci.encryption.KMSMasterKeyProvider(
    config=config,
    kms_master_keys=[kms_master_key]
)
 
# encrypt stream example
with open(output_encrypted_file, 'wb') as output_stream, open(file_to_encrypt, 'rb') as stream_to_encrypt:
    with crypto.create_encryption_stream(
        kms_master_key_provider,
        stream_to_encrypt
    ) as encryption_stream:
        shutil.copyfileobj(encryption_stream, output_stream)
 
# decrypt stream example
with open(output_decrypted_file, 'wb') as output_stream, open(output_encrypted_file, 'rb') as stream_to_decrypt:
    with crypto.create_decryption_stream(
        stream_to_decrypt,
        kms_master_key_provider
    ) as decryption_stream:
        shutil.copyfileobj(decryption_stream, output_stream)