Chiffrement côté client
La trousse SDK pour Oracle Cloud Infrastructure pour Python et la trousse SDK pour Java prennent en charge le chiffrement côté client, qui chiffre vos données du côté client avant de les stocker localement ou de les utiliser avec d'autres services Oracle Cloud Infrastructure.
Par défaut, la trousse SDK génère une clé de données unique pour chaque objet de données qu'elle chiffre. Les données sont chiffrées à l'aide d'un algorithme AES/GCM sécurisé, authentifié et symétrique ayant une longueur de clé de 256 bits.
Pour utiliser le chiffrement côté client, vous devez créer une clé de chiffrement principale à l'aide du service de gestion des clés. Cette création peut être effectuée à l'aide des opérations CreateKey ou ImportKey.
La clé de chiffrement principale sert à générer une clé de chiffrement des données pour chiffrer les données utiles. Une copie chiffrée de cette clé de chiffrement des données (chiffrée à l'aide de la clé de chiffrement principale) et d'autres éléments de métadonnées sont inclus dans les données utiles chiffrées retournées par les trousses SDK pour pouvoir être utilisés pour le déchiffrement.
Préalables pour Java
Les fichiers de politique sans limite pour des versions antérieures ne sont requis que pour les mises à jour JDK 8, 7 et 6 antérieures à 8u161, 7u171 et 6u16. Pour ces versions et les versions ultérieures, les fichiers de politique sont inclus mais ne sont pas activés par défaut.
Les versions courantes de JDK ne requièrent pas ces fichiers de politique. Elles sont fournies ici pour être utilisées avec d'anciennes versions de JDK. La version JDK 9 et les versions ultérieures comprennent les fichiers de politiques sans limite et les utilisent par défaut.
Exemples
L'exemple de code suivant montre comment chiffrer une chaîne :
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()))
Les exemples suivants montrent comment chiffrer un flux de fichiers :
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)