Menggunakan AWS KMS kunci untuk enkripsi Amazon S3 di AWS SDK for .NET - AWS SDK for .NET

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan AWS KMS kunci untuk enkripsi Amazon S3 di AWS SDK for .NET

Contoh ini menunjukkan cara menggunakan AWS Key Management Service kunci untuk mengenkripsi objek Amazon S3. Aplikasi ini membuat kunci master pelanggan (CMK) dan menggunakannya untuk membuat objek AmazonS3 EncryptionClient V2 untuk enkripsi sisi klien. Aplikasi menggunakan klien tersebut untuk membuat objek terenkripsi dari file teks tertentu di bucket Amazon S3 yang ada. Kemudian mendekripsi objek dan menampilkan isinya.

Awas

Kelas serupa yang AmazonS3EncryptionClient disebut tidak digunakan lagi dan kurang aman daripada kelas. AmazonS3EncryptionClientV2 Untuk memigrasikan kode yang ada yang menggunakanAmazonS3EncryptionClient, lihatMigrasi Klien Enkripsi S3.

Buat bahan enkripsi

Cuplikan berikut membuat EncryptionMaterials objek yang berisi ID KMS kunci.

Contoh di akhir topik ini menunjukkan cuplikan ini digunakan.

// Create a customer master key (CMK) and store the result CreateKeyResponse createKeyResponse = await new AmazonKeyManagementServiceClient().CreateKeyAsync(new CreateKeyRequest()); var kmsEncryptionContext = new Dictionary<string, string>(); var kmsEncryptionMaterials = new EncryptionMaterialsV2( createKeyResponse.KeyMetadata.KeyId, KmsType.KmsContext, kmsEncryptionContext);

Membuat dan mengenkripsi objek Amazon S3

Cuplikan berikut membuat AmazonS3EncryptionClientV2 objek yang menggunakan bahan enkripsi yang dibuat sebelumnya. Kemudian menggunakan klien untuk membuat dan mengenkripsi objek Amazon S3 baru.

Contoh di akhir topik ini menunjukkan cuplikan ini digunakan.

// // Method to create and encrypt an object in an S3 bucket static async Task<GetObjectResponse> CreateAndRetrieveObjectAsync( EncryptionMaterialsV2 materials, string bucketName, string fileName, string itemName) { // CryptoStorageMode.ObjectMetadata is required for KMS EncryptionMaterials var config = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var s3EncClient = new AmazonS3EncryptionClientV2(config, materials); // Create, encrypt, and put the object await s3EncClient.PutObjectAsync(new PutObjectRequest { BucketName = bucketName, Key = itemName, ContentBody = File.ReadAllText(fileName) }); // Get, decrypt, and return the object return await s3EncClient.GetObjectAsync(new GetObjectRequest { BucketName = bucketName, Key = itemName }); }

Kode lengkap

Bagian ini menunjukkan referensi yang relevan dan kode lengkap untuk contoh ini.

using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; using Amazon.KeyManagementService; using Amazon.KeyManagementService.Model; namespace KmsS3Encryption { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to store text in an encrypted S3 object. class Program { private const int MaxArgs = 3; public static async Task Main(string[] args) { // Parse the command line and show help if necessary var parsedArgs = CommandLine.Parse(args); if((parsedArgs.Count == 0) || (parsedArgs.Count > MaxArgs)) { PrintHelp(); return; } // Get the application arguments from the parsed list string bucketName = CommandLine.GetArgument(parsedArgs, null, "-b", "--bucket-name"); string fileName = CommandLine.GetArgument(parsedArgs, null, "-f", "--file-name"); string itemName = CommandLine.GetArgument(parsedArgs, null, "-i", "--item-name"); if(string.IsNullOrEmpty(bucketName) || (string.IsNullOrEmpty(fileName))) CommandLine.ErrorExit( "\nOne or more of the required arguments is missing or incorrect." + "\nRun the command with no arguments to see help."); if(!File.Exists(fileName)) CommandLine.ErrorExit($"\nThe given file {fileName} doesn't exist."); if(string.IsNullOrEmpty(itemName)) itemName = Path.GetFileName(fileName); // Create a customer master key (CMK) and store the result CreateKeyResponse createKeyResponse = await new AmazonKeyManagementServiceClient().CreateKeyAsync(new CreateKeyRequest()); var kmsEncryptionContext = new Dictionary<string, string>(); var kmsEncryptionMaterials = new EncryptionMaterialsV2( createKeyResponse.KeyMetadata.KeyId, KmsType.KmsContext, kmsEncryptionContext); // Create the object in the bucket, then display the content of the object var putObjectResponse = await CreateAndRetrieveObjectAsync(kmsEncryptionMaterials, bucketName, fileName, itemName); Stream stream = putObjectResponse.ResponseStream; StreamReader reader = new StreamReader(stream); Console.WriteLine(reader.ReadToEnd()); } // // Method to create and encrypt an object in an S3 bucket static async Task<GetObjectResponse> CreateAndRetrieveObjectAsync( EncryptionMaterialsV2 materials, string bucketName, string fileName, string itemName) { // CryptoStorageMode.ObjectMetadata is required for KMS EncryptionMaterials var config = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var s3EncClient = new AmazonS3EncryptionClientV2(config, materials); // Create, encrypt, and put the object await s3EncClient.PutObjectAsync(new PutObjectRequest { BucketName = bucketName, Key = itemName, ContentBody = File.ReadAllText(fileName) }); // Get, decrypt, and return the object return await s3EncClient.GetObjectAsync(new GetObjectRequest { BucketName = bucketName, Key = itemName }); } // // Command-line help private static void PrintHelp() { Console.WriteLine( "\nUsage: KmsS3Encryption -b <bucket-name> -f <file-name> [-i <item-name>]" + "\n -b, --bucket-name: The name of an existing S3 bucket." + "\n -f, --file-name: The name of a text file with content to encrypt and store in S3." + "\n -i, --item-name: The name you want to use for the item." + "\n If item-name isn't given, file-name will be used."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class that represents a command line on the console or terminal. // (This is the same for all examples. When you have seen it once, you can ignore it.) static class CommandLine { // // Method to parse a command line of the form: "--key value" or "-k value". // // Parameters: // - args: The command-line arguments passed into the application by the system. // // Returns: // A Dictionary with string Keys and Values. // // If a key is found without a matching value, Dictionary.Value is set to the key // (including the dashes). // If a value is found without a matching key, Dictionary.Key is set to "--NoKeyN", // where "N" represents sequential numbers. public static Dictionary<string,string> Parse(string[] args) { var parsedArgs = new Dictionary<string,string>(); int i = 0, n = 0; while(i < args.Length) { // If the first argument in this iteration starts with a dash it's an option. if(args[i].StartsWith("-")) { var key = args[i++]; var value = key; // Check to see if there's a value that goes with this option? if((i < args.Length) && (!args[i].StartsWith("-"))) value = args[i++]; parsedArgs.Add(key, value); } // If the first argument in this iteration doesn't start with a dash, it's a value else { parsedArgs.Add("--NoKey" + n.ToString(), args[i++]); n++; } } return parsedArgs; } // // Method to get an argument from the parsed command-line arguments // // Parameters: // - parsedArgs: The Dictionary object returned from the Parse() method (shown above). // - defaultValue: The default string to return if the specified key isn't in parsedArgs. // - keys: An array of keys to look for in parsedArgs. public static string GetArgument( Dictionary<string,string> parsedArgs, string defaultReturn, params string[] keys) { string retval = null; foreach(var key in keys) if(parsedArgs.TryGetValue(key, out retval)) break; return retval ?? defaultReturn; } // // Method to exit the application with an error. public static void ErrorExit(string msg, int code=1) { Console.WriteLine("\nError"); Console.WriteLine(msg); Environment.Exit(code); } } }

Pertimbangan tambahan

  • Anda dapat memeriksa hasil dari contoh ini. Untuk melakukannya, buka konsol Amazon S3 dan buka ember yang Anda berikan ke aplikasi. Kemudian temukan objek baru, unduh, dan buka di editor teks.

  • Kelas AmazonS3 EncryptionClient V2 mengimplementasikan antarmuka yang sama dengan kelas standar. AmazonS3Client Ini membuatnya lebih mudah untuk mem-port kode Anda ke AmazonS3EncryptionClientV2 kelas sehingga enkripsi dan dekripsi terjadi secara otomatis dan transparan di klien.

  • Salah satu keuntungan menggunakan AWS KMS kunci sebagai kunci utama Anda adalah Anda tidak perlu menyimpan dan mengelola kunci master Anda sendiri; ini dilakukan oleh AWS. Keuntungan kedua adalah bahwa AmazonS3EncryptionClientV2 kelas interoperable dengan AmazonS3EncryptionClientV2 kelas. AWS SDK for .NET AWS SDK for Java Ini berarti Anda dapat mengenkripsi dengan AWS SDK for Java dan mendekripsi dengan AWS SDK for .NET, dan sebaliknya.

    catatan

    AmazonS3EncryptionClientV2Kelas AWS SDK for .NET mendukung kunci KMS master hanya ketika dijalankan dalam mode metadata. Mode file instruksi dari AmazonS3EncryptionClientV2 kelas tidak AWS SDK for .NET kompatibel dengan AmazonS3EncryptionClientV2 kelas file. AWS SDK for Java