全部产品
Search
文档中心

Key Management Service:Gunakan enkripsi amplop untuk mengenkripsi dan mendekripsi data lokal

更新时间:Jul 06, 2025

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信封加密:

    1. Buat CMK di konsol KMS atau dengan memanggil operasi CreateKey.

    2. Panggil operasi GenerateDataKey untuk menghasilkan kunci data. KMS mengembalikan teks biasa dan teks sandi dari kunci data.

    3. Gunakan kunci data teks biasa untuk mengenkripsi file lokal, lalu hapus kunci data teks biasa dari memori.

    4. Simpan kunci data teks sandi dan file data terenkripsi di perangkat atau layanan penyimpanan persisten.

  • Prosedur Dekripsi Amplop 信封解密:

    1. Ambil kunci data teks sandi dari file lokal.

    2. Panggil operasi Decrypt dari KMS untuk mendekripsi kunci data teks sandi. Teks biasa dari kunci data dikembalikan.

    3. 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

CreateKey

Membuat CMK.

CreateAlias

Membuat alias untuk CMK.

GenerateDataKey

Menghasilkan kunci data dan menggunakan CMK yang ditentukan untuk mengenkripsi kunci data. KMS mengembalikan teks biasa dan teks sandi dari kunci data.

Decrypt

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

Catatan

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.

Anda dapat membuat CMK dan mengenkripsi serta mendekripsi file lokal menggunakan CLI Alibaba Cloud.

  1. Panggil operasi CreateKey untuk membuat CMK.

    aliyun kms CreateKey

    Keluaran 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"
    }
  2. 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****
    Catatan

    Dalam contoh ini, Apollo/WorkKey adalah alias CMK di Apollo proyek. Anda dapat menggunakan alias alias/Apollo/WorkKey dalam kode sampel berikutnya untuk memanggil operasi Encrypt.

  3. Enkripsi file lokal.

    Dalam kode sampel berikut:

    • alias/Apollo/WorkKey adalah 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)
  4. 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
      )