클라이언트 측 암호화를 사용하여 데이터 보호 - Amazon Simple Storage Service

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

클라이언트 측 암호화를 사용하여 데이터 보호

클라이언트 측 암호화 데이터를 암호화하기 전에 암호화하는 행위입니다. Amazon S3. 클라이언트 측 암호화를 활성화하기 위한 다음 옵션이 있습니다.

  • 에 저장된 고객 마스터 키(CMK) 사용 AWS Key Management Service (AWS KMS) ).

  • 응용 프로그램 내에 저장한 마스터 키를 사용합니다.

다음 AWS SDK에서 클라이언트 측 암호화를 지원합니다.

옵션 1 에 저장된 CMK 사용 AWS KMS

이 옵션을 사용하면 AWS KMS 데이터 업로드 또는 다운로드 시 클라이언트 측 암호화를 위한 CMK Amazon S3.

  • 개체를 업로드할 때 — CMK ID를 사용하여 클라이언트는 먼저 AWS KMS CMK의 경우 개체 데이터를 암호화하는 데 사용할 수 있습니다. AWS KMS 무작위로 생성된 데이터 키 두 개를 반환합니다.

    • 클라이언트가 객체 데이터를 암호화하는 데 사용하는 일반 텍스트 버전의 데이터 키

    • 클라이언트가 Amazon S3에 객체 메타데이터로 업로드하는 동일한 데이터 키의 암호 BLOB

    참고

    클라이언트는 업로드하는 각 객체에 대해 고유한 데이터 키를 가져옵니다.

  • 개체를 다운로드할 때 — 클라이언트가 암호화된 개체를 다운로드합니다. Amazon S3 데이터 키의 암호 blob 버전과 함께 개체 메타데이터로 저장된 데이터 키와 함께 그런 다음 클라이언트가 암호 BLOB를 AWS KMS로 보내 객체 데이터의 암호 해독을 위해 일반 텍스트 버전의 데이터 키를 가져옵니다.

자세한 정보는 AWS KMS, 참조: 무엇을 AWS Key Management Service? in the AWS Key Management Service Developer Guide.

다음 코드 예는 개체를 업로드하는 방법을 보여줍니다. Amazon S3 사용 AWS KMS 함께 AWS SDK for Java. 예는 AWS 클라이언트 측에서 데이터를 암호화하기 전에 CMK를 관리할 수 있도록 Amazon S3. 이미 CMK가 있는 경우, keyId 예제 코드 의 변수를 참조하십시오. CMK가 없거나 다른 키가 필요한 경우 Java API를 통해 하나 생성할 수 있습니다. 예제 코드는 사용할 CMK를 자동으로 생성합니다.

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 단원을 참조하십시오.Amazon S3 Java 코드 예제 테스트.

AWSKMS kmsClient = AWSKMSClientBuilder.standard() .withRegion(Regions.DEFAULT_REGION) .build(); // create CMK for for testing this example CreateKeyRequest createKeyRequest = new CreateKeyRequest(); CreateKeyResult createKeyResult = kmsClient.createKey(createKeyRequest); // -- // specify an Amazon KMS customer master key (CMK) ID String keyId = createKeyResult.getKeyMetadata().getKeyId(); String s3ObjectKey = "EncryptedContent1.txt"; String s3ObjectContent = "This is the 1st content to encrypt"; // -- AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard() .withRegion(Regions.US_WEST_2) .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.StrictAuthenticatedEncryption)) .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId)) .build(); s3Encryption.putObject(bucket_name, s3ObjectKey, s3ObjectContent); System.out.println(s3Encryption.getObjectAsString(bucket_name, s3ObjectKey)); // schedule deletion of CMK generated for testing ScheduleKeyDeletionRequest scheduleKeyDeletionRequest = new ScheduleKeyDeletionRequest().withKeyId(keyId).withPendingWindowInDays(7); kmsClient.scheduleKeyDeletion(scheduleKeyDeletionRequest); s3Encryption.shutdown(); kmsClient.shutdown();

옵션 2: 애플리케이션 내에 저장된 마스터 키 사용

이 옵션을 사용하면 클라이언트 측 데이터 암호화를 위해 애플리케이션 내에 저장된 마스터 키를 사용합니다.

중요

클라이언트 측 마스터 키와 암호화되지 않은 데이터는 로 전송되지 않습니다.AWS. 따라서 암호화 키를 안전하게 관리하는 것이 중요합니다. 해당 키를 잃어버리면 데이터의 암호를 해독할 수 없습니다.

작동 방법은 다음과 같습니다.

  • 개체를 업로드할 때 — 고객에게 Amazon S3 암호화 클라이언트 클라이언트에서는 임의로 생성하는 데이터 암호화 키를 암호화하기 위해서만 이 마스터 키를 사용합니다.

    다음 단계는 프로세스를 설명합니다.

    1. The Amazon S3 암호화 클라이언트는 데이터 암호화 키 또는 데이터 키)로컬로 ) 또한 데이터 키를 사용하여 단일 Amazon S3 객체의 데이터를 암호화합니다. 클라이언트는 각 객체에 대한 개별 데이터 키를 생성합니다.

    2. 클라이언트에서 사용자가 제공하는 마스터 키를 사용하여 데이터 암호화 키를 암호화합니다. 클라이언트에서 암호화된 데이터 키 및 해당 구성 요소 설명을 객체 메타데이터의 일부로 업로드합니다. 클라이언트는 구성 요소 설명을 사용하여 어떤 클라이언트 측 마스터 키를 암호화에 사용할지 결정합니다.

    3. 클라이언트가 암호화된 데이터를 업로드하는 경우 Amazon S3 암호화 데이터 키를 개체 메타데이터로 저장합니다(x-amz-meta-x-amz-key) Amazon S3.

  • 개체를 다운로드할 때 — 클라이언트가 암호화된 개체를 다운로드합니다. Amazon S3. 클라이언트에서 먼저 객체 메타데이터의 구성 요소 설명을 사용하여 데이터 키의 암호 해독에 어떤 마스터 키를 사용할지를 결정합니다. 클라이언트는 해당 마스터 키를 사용하여 데이터 키를 암호 해독하고 나서 데이터 키를 사용하여 객체를 암호 해독합니다.

사용자가 제공하는 클라이언트 측 마스터 키는 대칭 키 또는 퍼블릭/프라이빗 키 페어일 수 있습니다. 다음 코드 예는 각 유형의 키를 사용하는 방법을 보여줍니다.

자세한 내용은 클라이언트측 데이터 암호화 AWS SDK for Java and Amazon S3.

참고

암호화 API를 처음 사용할 때 암호화 오류 메시지가 나타나면 JDK의 버전에는 암호화 및 암호 해독 변환의 최대 키 길이를 128비트로 제한하는 JCE(Java Cryptography Extension) 관할권 정책 파일이 있을 수 있습니다. The AWS SDK는 최대 키 길이 256비트를 필요로 합니다.

최대 키 길이를 확인하려면 getMaxAllowedKeyLength() 방법 javax.crypto.Cipher 클래스. 키 길이 제한을 제거하려면 JCE(Java Cryptography Extension) 무제한 강점 관할권 정책 파일.

다음 코드 예는 이러한 작업을 수행하는 방법을 보여 줍니다.

  • 256비트 AES 키 생성

  • AES 키를 사용하여 에 데이터를 보내기 전에 클라이언트 측에서 데이터 암호화Amazon S3.

  • AES 키를 사용하여 에서 가져온 데이터 암호 해독Amazon S3.

  • 해독 개체의 문자열 표현을 인쇄합니다.

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 단원을 참조하십시오.Amazon S3 Java 코드 예제 테스트.

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(256); // -- // generate a symmetric encryption key for testing SecretKey secretKey = keyGenerator.generateKey(); String s3ObjectKey = "EncryptedContent2.txt"; String s3ObjectContent = "This is the 2nd content to encrypt"; // -- AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard() .withRegion(Regions.DEFAULT_REGION) .withClientConfiguration(new ClientConfiguration()) .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.AuthenticatedEncryption)) .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(secretKey))) .build(); s3Encryption.putObject(bucket_name, s3ObjectKey, s3ObjectContent); System.out.println(s3Encryption.getObjectAsString(bucket_name, s3ObjectKey)); s3Encryption.shutdown();

다음 코드 예는 이러한 작업을 수행하는 방법을 보여 줍니다.

  • 테스트 목적으로 2048비트 RSA 키 쌍을 생성합니다.

  • RSA 키를 사용하여 에 데이터를 보내기 전에 클라이언트 측에서 데이터를 암호화합니다.Amazon S3.

  • RSA 키를 사용하여 에서 가져온 데이터 암호를 해독합니다.Amazon S3.

  • 해독 개체의 문자열 표현을 인쇄합니다.

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 단원을 참조하십시오.Amazon S3 Java 코드 예제 테스트.

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); // -- // generate an asymmetric key pair for testing KeyPair keyPair = keyPairGenerator.generateKeyPair(); String s3ObjectKey = "EncryptedContent3.txt"; String s3ObjectContent = "This is the 3rd content to encrypt"; // -- AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard() .withRegion(Regions.US_WEST_2) .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.StrictAuthenticatedEncryption)) .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(keyPair))) .build(); s3Encryption.putObject(bucket_name, s3ObjectKey, s3ObjectContent); System.out.println(s3Encryption.getObjectAsString(bucket_name, s3ObjectKey)); s3Encryption.shutdown();