aws-encryption-sdk — aws-encryption-sdk-python 4.0.1 documentation (original) (raw)

Latest Version Supported Python Versions Code style: black Documentation Status

The AWS Encryption SDK for Python provides a fully compliant, native Python implementation of the AWS Encryption SDK.

The latest full documentation can be found at Read the Docs.

Find us on GitHub.

Security issue notifications

See Support Policy for details on the current support status of all major versions of this library.

Getting Started

Required Prerequisites

Installation

Note

If you have not already installed cryptography, you might need to install additional prerequisites as detailed in the cryptography installation guide for your operating system.

$ pip install "aws-encryption-sdk[MPL]"

The [MPL] suffix also installs the AWS Cryptographic Material Providers Library (MPL). This is a library that contains constructs for encrypting and decrypting your data. We highly recommend installing the MPL. However, if you do not wish to install the MPL, omit the [MPL] suffix.

Concepts

There are three main concepts that you need to understand to use this library:

Data Keys

Data keys are the encryption keys that are used to encrypt your data. If your algorithm suite uses a key derivation function, the data key is used to generate the key that directly encrypts the data.

Keyrings

Keyrings are resources that generate, encrypt, and decrypt data keys. You specify a keyring when encrypting and the same or a different keyring when decrypting.

Note: You must also install the AWS Cryptographic Material Providers Library (MPL) to create and use keyrings.

For more information, see the AWS Documentation for Keyrings.

Cryptographic Materials Managers

Cryptographic materials managers (CMMs) are resources that collect cryptographic materials and prepare them for use by the Encryption SDK core logic.

An example of a CMM is the default CMM, which is automatically generated anywhere a caller provides a keyring.

Note: You must also install the AWS Cryptographic Material Providers Library (MPL)to create and use CMMs that use keyrings. CMMs that use master key providers have been marked as legacy since v4 of this library.

Legacy Concepts

This section describes legacy concepts introduced in earlier versions of this library. These components have been superseded by new components in the AWS Cryptographic Material Providers Library (MPL). Please avoid using these components, and instead use components in the MPL.

Master Key Providers

Master key providers are resources that provide master keys.

To encrypt data in this client, a MasterKeyProvider object must contain at least one MasterKey object.

MasterKeyProvider objects can also contain other MasterKeyProvider objects.

NOTE: Master key providers are legacy components and have been superseded by keyrings provided by the AWS Cryptographic Material Providers Library (MPL). Please install this library and migrate master key providers to keyring interfaces.

Master Keys

Master keys generate, encrypt, and decrypt data keys. An example of a master key is an AWS KMS key.

NOTE: Master keys are legacy constructs and have been superseded by keyrings provided by the AWS Cryptographic Material Providers Library (MPL). Please install this library and migrate master key providers to keyring interfaces.

Usage

EncryptionSDKClient

To use this module, you (the caller) must first create an instance of the EncryptionSDKClient class. The constructor to this class accepts an optional keyword argument, commitment_policy, that controls which algorithm suites can be used for encryption and decryption. If no value is provided for this argument, a default value of REQUIRE_ENCRYPT_REQUIRE_DECRYPT is used. Unless you have specialized performance requirements or are in the process of migrating from an older version of the AWS Encryption SDK, we recommend using the default value.

import aws_encryption_sdk from aws_encryption_sdk.identifiers import CommitmentPolicy

client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT )

You must then create an instance of either a keyring (with the MPL installed) or a CMM. Note: You must also install the AWS Cryptographic Material Providers Library (MPL) to use keyrings. (You may also provide an instance of a legacy master key provider, but this is not recommended.)

AwsKmsMultiKeyring

An AwsKmsMultiKeyring is configured with a generator keyring and a list of child keyrings of type AwsKmsKeyring. The effect is like using several keyrings in a series. When you use a multi-keyring to encrypt data, any of the wrapping keys in any of its keyrings can decrypt that data.

On encryption, the generator keyring generates and encrypts the plaintext data key. Then, all of the wrapping keys in all of the child keyrings encrypt the same plaintext data key. The final encrypted message will include a copy of the data key encrypted by each configured key. On decryption, the AWS Encryption SDK uses the keyrings to try to decrypt one of the encrypted data keys. The keyrings are called in the order that they are specified in the multi-keyring. Processing stops as soon as any key in any keyring can decrypt an encrypted data key.

An individual AwsKmsKeyring in an AwsKmsMultiKeyring is configured with an AWS KMS key ARN. For keyrings that will only be used for encryption, you can use any valid KMS key identifier. For providers that will be used for decryption, you must use the key ARN. Key ids, alias names, and alias ARNs are not supported for decryption.

Because the AwsKmsMultiKeyring uses the boto3 SDK to interact with AWS KMS, it requires AWS Credentials. To provide these credentials, use the standard means by which boto3 locates credentials or provide a pre-existing instance of a botocore session to the AwsKmsMultiKeyring. This latter option can be useful if you have an alternate way to store your AWS credentials or you want to reuse an existing instance of a botocore session in order to decrease startup costs. You can also add KMS keys from multiple regions to the AwsKmsMultiKeyring.

See examples/src/aws_kms_multi_keyring_example.py for a code example configuring and using a AwsKmsMultiKeyring with the EncryptionSDKClient.

AwsKmsDiscoveryKeyring

We recommend using an AwsKmsMultiKeyring in order to ensure that you can only encrypt and decrypt data using the AWS KMS key ARN you expect. However, if you are unable to explicitly identify the AWS KMS key ARNs that should be used for decryption, you can instead use an AwsKmsDiscoveryKeyring for decryption operations. This provider attempts decryption of any ciphertexts as long as they match a DiscoveryFilter that you configure. A DiscoveryFilter consists of a list of AWS account ids and an AWS partition. If you do not want to filter the set of allowed accounts, you can also omit the discovery_filter argument.

Note that an AwsKmsDiscoveryKeyring cannot be used for encryption operations.

See examples/src/aws_kms_discovery_keyring_example.py for a code example configuring and using an AwsKmsDiscoveryKeyring with the EncryptionSDKClient.

Encryption and Decryption

After you create an instance of an EncryptionSDKClient and a Keyring, you can use the client’s encrypt and decrypt functions to encrypt and decrypt your data.

You can also provide an encryption context: a form of additional authenticating information.

See code in the examples/src/ directory for code examples configuring and using keyrings and encryption context with the EncryptionSDKClient.

Streaming

If you are handling large files or simply do not want to put the entire plaintext or ciphertext in memory at once, you can use this library’s streaming clients directly. The streaming clients are file-like objects, and behave exactly as you would expect a Python file object to behave, offering context manager and iteration support.

See examples/src/file_streaming_example.py for a code example streaming data to and from files.

Performance Considerations

Adjusting the frame size can significantly improve the performance of encrypt/decrypt operations with this library.

Processing each frame in a framed message involves a certain amount of overhead. If you are encrypting a large file, increasing the frame size can offer potentially significant performance gains. We recommend that you tune these values to your use-case in order to obtain peak performance.

Thread safety

The EncryptionSDKClient and all provided CryptoMaterialsManager in this library are thread safe. But instances of BaseKMSMasterKeyProvider MUST not be shared between threads, for the reasons outlined in the boto3 docs.

Because the BaseKMSMaterKeyProvider creates a new boto3 sessions per region, users do not need to create a client for every region in every thread; a new BaseKMSMasterKeyProvider per thread is sufficient.

(The BaseKMSMasterKeyProvider is the internal parent class of all the KMS Providers.)

Finally, while the CryptoMaterialsCache is thread safe, sharing entries in that cache across threads needs to be done carefully (see the !Note about partition name in the API Docs).

Important: Components from the AWS Cryptographic Material Providers Library (MPL)have separate thread safety considerations. For more information, see the note on thread safety in that project’s README.

Modules

aws_encryption_sdk High level AWS Encryption SDK client functions.
aws_encryption_sdk.exceptions Contains exception classes for AWS Encryption SDK.
aws_encryption_sdk.identifiers AWS Encryption SDK native data structures for defining implementation-specific characteristics.
aws_encryption_sdk.caches Common functions and structures for use in cryptographic materials caches.
aws_encryption_sdk.caches.base Base class interface for caches for use with caching crypto material managers.
aws_encryption_sdk.caches.local Local, in-memory, LRU, cryptographic materials cache for use with caching cryptographic materials providers.
aws_encryption_sdk.caches.null Null cache: a cache which does not cache.
aws_encryption_sdk.key_providers.base Base class interface for Master Key Providers.
aws_encryption_sdk.key_providers.kms Master Key Providers for use with AWS KMS
aws_encryption_sdk.key_providers.raw Resources required for Raw Master Keys.
aws_encryption_sdk.materials_managers Primitive structures for use when interacting with crypto material managers.
aws_encryption_sdk.materials_managers.base Base class interface for crypto material managers.
aws_encryption_sdk.materials_managers.caching Caching crypto material manager.
aws_encryption_sdk.materials_managers.default Default crypto material manager class.
aws_encryption_sdk.streaming_client High level AWS Encryption SDK client for streaming objects.
aws_encryption_sdk.structures Public data structures for aws_encryption_sdk.
aws_encryption_sdk.internal Internal Implementation Details
aws_encryption_sdk.internal.crypto.authentication Contains authentication primitives.
aws_encryption_sdk.internal.crypto.data_keys Contains data key helper functions.
aws_encryption_sdk.internal.crypto.elliptic_curve Contains elliptic curve functionality.
aws_encryption_sdk.internal.crypto.encryption Contains encryption primitives and helper functions.
aws_encryption_sdk.internal.crypto.iv Helper functions used for generating deterministic initialization vectors (IVs).
aws_encryption_sdk.internal.crypto.wrapping_keys Contains wrapping key primitives.
aws_encryption_sdk.internal.defaults Default values for AWS Encryption SDK.
aws_encryption_sdk.internal.formatting Formatting functions for aws_encryption_sdk.
aws_encryption_sdk.internal.formatting.deserialize Components for handling AWS Encryption SDK message deserialization.
aws_encryption_sdk.internal.formatting.encryption_context Components for handling serialization and deserialization of encryption context data in AWS Encryption SDK messages.
aws_encryption_sdk.internal.formatting.serialize Components for handling AWS Encryption SDK message serialization.
aws_encryption_sdk.internal.str_ops Helper functions for consistently obtaining str and bytes objects in both Python2 and Python3.
aws_encryption_sdk.internal.structures Public data structures for aws_encryption_sdk.
aws_encryption_sdk.internal.utils Helper utility functions for AWS Encryption SDK.

Changelog

4.0.1 – 2025-03-26

Fixes

Maintenance

4.0.0 – 2024-10-29

Features

Breaking Changes

Fixes

3.3.0 – 2024-05-20

Deprecation

The AWS Encryption SDK for Python no longer supports Python 3.7 as of version 3.3; only Python 3.8+ is supported.

Fixes

Maintenance

3.2.0 – 2024-03-18

Features

Fixes

Maintenance

3.1.1 – 2022-06-20

Maintenance

3.1.0 – 2021-11-10

Deprecation

The AWS Encryption SDK for Python no longer supports Python 3.5 as of version 3.1; only Python 3.6+ is supported. Customers using Python 3.5 can still use the 2.x line of the AWS Encryption SDK for Python, which will continue to receive security updates, in accordance with our Support Policy.

Feature

3.0.0 – 2021-07-01

Deprecation

The AWS Encryption SDK for Python no longer supports Python 2 or Python 3.4 as of major version 3.x; only Python 3.5+ is supported. Customers using Python 2 or Python 3.4 can still use the 2.x line of the AWS Encryption SDK for Python, which will continue to receive security updates for the next 12 months, in accordance with our Support Policy.

Maintenance

2.4.0 – 2021-07-01

Deprecation Announcement

The AWS Encryption SDK for Python is discontinuing support for Python 2. Future major versions of this library will drop support for Python 2 and begin to adopt changes that are known to break Python 2.

Support for Python 3.4 will be removed at the same time. Moving forward, we will support Python 3.5+.

Security updates will still be available for the Encryption SDK 2.x line for the next 12 months, in accordance with our Support Policy.

2.3.0 – 2021-06-16

Features

2.2.0 – 2021-05-27

Features

2.1.0 – 2020-04-20

Maintenance

2.0.0 – 2020-09-24

Features

Breaking Changes

See Migration guidefor more details.

1.7.0 – 2020-09-24

Features

Deprecations

See Migration guidefor more details.

1.4.1 – 2019-09-20

Bugfixes

Minor

1.4.0 – 2019-05-23

Minor

Potentially Backwards Incompatible

Maintenance

Bugfixes

1.3.8 – 2018-11-15

Bugfixes

Minor

1.3.7 – 2018-09-20

Bugfixes

1.3.6 – 2018-09-04

Bugfixes

1.3.5 – 2018-08-01

1.3.4 – 2018-04-12

Bugfixes

Maintenance

1.3.3 – 2017-12-05

Bugfixes

Maintenance

1.3.2 – 2017-09-28

1.3.1 – 2017-09-12

Reorganization

Tooling

Maintenance

1.3.0 – 2017-08-04

Major

Minor

1.2.2 – 2017-05-23

1.2.0 – 2017-03-21