Anda harus mengenkripsi informasi sensitif di aset TI yang diterapkan di Alibaba Cloud. Jika perlu mengenkripsi sejumlah besar data lokal, Anda dapat memanggil operasi API kriptografi dari Key Management Service (KMS) untuk menghasilkan kunci data secara online, lalu menggunakan kunci tersebut untuk mengenkripsi data lokal secara offline. Mekanisme ini disebut enkripsi amplop.
Informasi latar belakang
Enkripsi amplop dapat digunakan dalam skenario berikut, namun tidak terbatas pada:
Mengenkripsi file data bisnis.
Mengenkripsi semua data yang tersimpan di disk lokal.
Topik ini menjelaskan cara menggunakan enkripsi amplop untuk mengenkripsi dan mendekripsi file lokal.
Cara kerja enkripsi dan dekripsi data
Gunakan KMS untuk membuat kunci master pelanggan (CMK), gunakan CMK untuk menghasilkan kunci data, lalu gunakan kunci data tersebut untuk mengenkripsi dan mendekripsi file lokal. Enkripsi amplop cocok untuk mengenkripsi dan mendekripsi sejumlah besar data. Gambar berikut menunjukkan prosedur enkripsi amplop.
Prosedur Enkripsi Amplop
:Buat CMK di konsol KMS atau dengan memanggil operasi CreateKey.
Panggil operasi GenerateDataKey untuk menghasilkan kunci data. KMS mengembalikan teks biasa dan teks sandi dari kunci data.
Gunakan kunci data teks biasa untuk mengenkripsi file lokal, lalu hapus kunci data teks biasa dari memori.
Simpan kunci data teks sandi dan file data terenkripsi di perangkat atau layanan penyimpanan persisten.
Prosedur Dekripsi Amplop
:Ambil kunci data teks sandi dari file lokal.
Panggil operasi Decrypt dari KMS untuk mendekripsi kunci data teks sandi. Teks biasa dari kunci data dikembalikan.
Gunakan kunci data teks biasa untuk mendekripsi file lokal, lalu hapus kunci data teks biasa dari memori.
Operasi API enkripsi dan dekripsi
Anda dapat memanggil operasi API yang dijelaskan dalam tabel berikut untuk mengenkripsi dan mendekripsi data lokal.
Operasi API | Deskripsi |
Membuat CMK. | |
Membuat alias untuk CMK. | |
Menghasilkan kunci data dan menggunakan CMK yang ditentukan untuk mengenkripsi kunci data. KMS mengembalikan teks biasa dan teks sandi dari kunci data. | |
Mendekripsi data yang dienkripsi di KMS, termasuk kunci data teks sandi yang dihasilkan dengan memanggil operasi GenerateDataKey. Anda tidak perlu menentukan CMK. |
Enkripsi dan dekripsi file lokal
Pasangan AccessKey akun Alibaba Cloud memiliki izin untuk semua operasi API. Menggunakan pasangan AccessKey untuk melakukan operasi adalah operasi berisiko tinggi. Kami merekomendasikan agar Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. Hindari menyimpan ID AccessKey dan Rahasia AccessKey di kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya yang dimiliki oleh akun Anda mungkin terganggu.
Dalam contoh ini, pasangan AccessKey disimpan dalam variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET untuk mengimplementasikan otentikasi identitas.
Untuk informasi lebih lanjut tentang cara mengonfigurasi informasi autentikasi, lihat Kelola Kredensial Akses.
Metode yang digunakan untuk mengonfigurasi variabel lingkungan bervariasi berdasarkan sistem operasi. Untuk informasi lebih lanjut, lihat Konfigurasikan Variabel Lingkungan di Linux, macOS, dan Windows.
Anda dapat membuat CMK dan mengenkripsi serta mendekripsi file lokal menggunakan CLI Alibaba Cloud.
Panggil operasi CreateKey untuk membuat CMK.
aliyun kms CreateKeyKeluaran yang Diharapkan:
{ "KeyMetadata": { "CreationDate": "2019-04-08T07:45:54Z", "Description": "", "KeyId": "1234abcd-12ab-34cd-56ef-12345678****", "KeyState": "Enabled", "KeyUsage": "ENCRYPT/DECRYPT", "DeleteDate": "", "Creator": "151266687691****", "Arn": "acs:kms:cn-hangzhou:151266687691****:key/1234abcd-12ab-34cd-56ef-12345678****", "Origin": "Aliyun_KMS", "MaterialExpireTime": "" }, "RequestId": "2a37b168-9fa0-4d71-aba4-2077dd9e80df" }Opsional. Buat alias untuk CMK.
Alias secara opsional digunakan untuk mengidentifikasi CMK. Jika CMK tidak memiliki alias, Anda dapat menggunakan ID CMK untuk mengidentifikasi CMK.
aliyun kms CreateAlias --AliasName alias/Apollo/WorkKey --KeyId 1234abcd-12ab-34cd-56ef-12345678****CatatanDalam contoh ini,
Apollo/WorkKeyadalah alias CMK diApolloproyek. Anda dapat menggunakan aliasalias/Apollo/WorkKeydalam kode sampel berikutnya untuk memanggil operasi Encrypt.Enkripsi file lokal.
Dalam kode sampel berikut:
alias/Apollo/WorkKeyadalah alias CMK../data/sales.csv adalah file teks biasa.
./data/sales.csv.cipher adalah file teks sandi yang dikembalikan.
#!/usr/bin/env python #coding=utf-8 import json import base64 from Crypto.Cipher import AES from aliyunsdkcore import client from aliyunsdkkms.request.v20160120 import GenerateDataKeyRequest def KmsGenerateDataKey(client, key_alias): request = GenerateDataKeyRequest.GenerateDataKeyRequest() request.set_accept_format('JSON') request.set_KeyId(key_alias) request.set_NumberOfBytes(32) response = json.loads(client.do_action(request)) datakey_encrypted = response["CiphertextBlob"] datakey_plaintext = response["Plaintext"] return (datakey_plaintext, datakey_encrypted) def ReadTextFile(in_file): file = open(in_file, 'r') content = file.read() file.close() return content def WriteTextFile(out_file, lines): file = open(out_file, 'w') for ln in lines: file.write(ln) file.write('\n') file.close() # Format file keluaran (teks) # Baris 1: kunci data yang di-enkode b64 # Baris 2: IV yang di-enkode b64 # Baris 3: ciphertext yang di-enkode b64 # Baris 4: tag autentikasi yang di-enkode b64 def LocalEncrypt(datakey_plaintext, datakey_encrypted, in_file, out_file): data_key_binary = base64.b64decode(datakey_plaintext) cipher = AES.new(data_key_binary, AES.MODE_EAX) in_content = ReadTextFile(in_file) ciphertext, tag = cipher.encrypt_and_digest(in_content) lines = [datakey_encrypted, base64.b64encode(cipher.nonce), base64.b64encode(ciphertext), base64.b64encode(tag)]; WriteTextFile(out_file, lines) clt = client.AcsClient(os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'Region-Id') key_alias = 'alias/Apollo/WorkKey' in_file = './data/sales.csv' out_file = './data/sales.csv.cipher' # Hasilkan Kunci Data datakey = KmsGenerateDataKey(clt, key_alias) # Secara lokal enkripsi catatan penjualan LocalEncrypt(datakey[0], datakey[1], in_file, out_file)Dekripsi file lokal.
Dalam kode sampel berikut:
./data/sales.csv.cipher adalah file teks sandi.
./data/decrypted_sales.csv adalah file teks biasa yang dikembalikan.
#!/usr/bin/env python #coding=utf-8 import json import base64 from Crypto.Cipher import AES from aliyunsdkcore import client from aliyunsdkkms.request.v20160120 import DecryptRequest def KmsDecrypt(client, ciphertext): request = DecryptRequest.DecryptRequest() request.set_accept_format('JSON') request.set_CiphertextBlob(ciphertext) response = json.loads(client.do_action(request)) return response.get("Plaintext") def ReadTextFile(in_file): file = open(in_file, 'r') lines = [] for ln in file: lines.append(ln) file.close() return lines def WriteTextFile(out_file, content): file = open(out_file, 'w') file.write(content) file.close() def LocalDecrypt(datakey, iv, ciphertext, tag, out_file): cipher = AES.new(datakey, AES.MODE_EAX, iv) data = cipher.decrypt_and_verify(ciphertext, tag).decode('utf-8') WriteTextFile(out_file, data) clt = client.AcsClient(os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'Region-Id') in_file = './data/sales.csv.cipher' out_file = './data/decrypted_sales.csv' # Baca file terenkripsi in_lines = ReadTextFile(in_file) # Dekripsi kunci data datakey = KmsDecrypt(clt, in_lines[0]) # Secara lokal dekripsi catatan penjualan LocalDecrypt( base64.b64decode(datakey), base64.b64decode(in_lines[1]), # IV base64.b64decode(in_lines[2]), # Ciphertext base64.b64decode(in_lines[3]), # Tag autentikasi out_file )