Шифрование на стороне сервера и на стороне клиента в Amazon S3: всестороннее сравнение

Шифрование на стороне сервера и шифрование на стороне клиента — это два подхода к защите данных, хранящихся в Amazon S3 (Simple Storage Service). Давайте рассмотрим каждый метод и приведем несколько примеров кода.

  1. Шифрование на стороне сервера (SSE).
    Шифрование на стороне сервера означает, что шифрование и дешифрование данных выполняются сервером. Amazon S3 предоставляет три варианта SSE:

    а. SSE-S3: Amazon S3 управляет ключами шифрования.

    import boto3
    s3 = boto3.client('s3')
    response = s3.put_object(
       Bucket='your_bucket_name',
       Key='your_object_key',
       Body='your_data',
       ServerSideEncryption='AES256'
    )

    б. SSE-KMS: Amazon Key Management Service (KMS) управляет ключами шифрования.

    import boto3
    s3 = boto3.client('s3')
    response = s3.put_object(
       Bucket='your_bucket_name',
       Key='your_object_key',
       Body='your_data',
       ServerSideEncryption='aws:kms',
       SSEKMSKeyId='your_kms_key_id'
    )

    в. SSE-C: вы управляете ключами шифрования за пределами Amazon S3.

    import boto3
    import base64
    s3 = boto3.client('s3')
    key = base64.b64encode(b'your_encryption_key')
    response = s3.put_object(
       Bucket='your_bucket_name',
       Key='your_object_key',
       Body='your_data',
       ServerSideEncryption='AES256',
       SSECustomerAlgorithm='AES256',
       SSECustomerKey=key,
       SSECustomerKeyMD5=base64.b64encode(hashlib.md5(b'your_encryption_key').digest()).decode()
    )
  2. Шифрование на стороне клиента.
    Шифрование на стороне клиента означает, что шифрование и дешифрование данных происходит на стороне клиента перед их загрузкой в ​​Amazon S3. Для реализации шифрования на стороне клиента вы можете использовать различные библиотеки или платформы шифрования.

    Пример использования библиотеки boto3и библиотеки cryptographyдля шифрования:

    import boto3
    from cryptography.fernet import Fernet
    # Generate a random encryption key
    key = Fernet.generate_key()
    # Encrypt the data using the encryption key
    f = Fernet(key)
    encrypted_data = f.encrypt(b'your_data')
    # Upload the encrypted data to Amazon S3
    s3 = boto3.client('s3')
    response = s3.put_object(
       Bucket='your_bucket_name',
       Key='your_object_key',
       Body=encrypted_data
    )

    Чтобы получить данные, вам необходимо выполнить обратный процесс расшифровки на стороне клиента.