All Products
Search
Document Center

Key Management Service:Gunakan kunci untuk mengenkripsi dan mendekripsi data

Last Updated:Aug 26, 2026

Untuk aset yang dideploy di Alibaba Cloud atau lingkungan cloud lainnya yang memiliki Alamat IP publik, data sensitif harus disimpan dan ditransmisikan secara aman guna mengurangi risiko pelanggaran serta memenuhi persyaratan kepatuhan. Untuk volume kecil data sensitif, Anda dapat menggunakan Key Management Service (KMS) untuk melakukan enkripsi dan dekripsi online. Topik ini menjelaskan skenario, prasyarat, dan prosedur enkripsi serta dekripsi online.

Ruang Lingkup

  • Ukuran data untuk enkripsi atau dekripsi simetris tidak melebihi 6 KB per operasi.

  • Ukuran data untuk enkripsi atau dekripsi asimetris tidak melebihi 1 KB per operasi.

Catatan

Ukuran data yang lebih besar dalam satu operasi enkripsi meningkatkan kemungkinan kegagalan transmisi jaringan dan memperpanjang waktu transmisi. Waktu yang dibutuhkan oleh instans KMS untuk melakukan enkripsi dan dekripsi terhadap data tersebut juga meningkat.

Keamanan kunci

Peringatan

Jangan menyimpan kunci enkripsi di kode frontend. Kode JavaScript frontend sepenuhnya dikirimkan ke browser pengguna, sehingga nilai kunci dapat dilihat dan diekstraksi melalui alat developer browser. Baik itu symmetric key, kunci privat dari asymmetric key, maupun AccessKey yang digunakan untuk mengakses KMS—jika disematkan dalam kode frontend—dianggap telah dikompromikan. Setelah kunci bocor, penyerang dapat mendekripsi seluruh ciphertext historis, sehingga perlindungan enkripsi menjadi tidak efektif.

Pendekatan yang direkomendasikan adalah menyimpan seluruh bahan kunci di backend dan mengonsolidasikan operasi enkripsi serta dekripsi di backend:

  1. Frontend mentransmisikan data sensitif ke server backend melalui HTTPS, di mana TLS menjamin kerahasiaan selama transmisi.

  2. Server backend memanggil operasi KMS Encrypt atau AsymmetricEncrypt untuk mengenkripsi data dan menyimpan ciphertext di database atau penyimpanan lainnya.

  3. Ketika teks biasa diperlukan, backend memanggil operasi Decrypt atau AsymmetricDecrypt untuk mendekripsi data dan mengembalikan hasilnya ke frontend sesuai kebutuhan.

Dengan arsitektur ini, bahan kunci tetap dihosting dalam instans KMS dan tidak pernah keluar dari batas KMS. Backend hanya menyimpan kredensial untuk mengakses KMS, sedangkan frontend tidak pernah menyentuh kunci.

Persiapan

Sebelum mulai memanggil API untuk enkripsi dan dekripsi, selesaikan persiapan berikut.

Langkah 1: Beli dan aktifkan instans KMS

Beli dan aktifkan instans KMS (instans manajemen kunci perangkat lunak atau instans manajemen kunci perangkat keras) sesuai kebutuhan bisnis dan kepatuhan Anda. Untuk informasi lebih lanjut, lihat Beli dan aktifkan instans KMS.

Langkah 2: Buat kunci

Buat kunci di instans KMS yang telah diaktifkan sesuai skenario enkripsi Anda.

  • Symmetric key: digunakan untuk enkripsi dan dekripsi dalam lingkungan tepercaya.

  • Asymmetric key: digunakan untuk skenario yang melintasi batas kepercayaan, misalnya klien menggunakan kunci publik untuk mengenkripsi dan server menggunakan kunci privat untuk mendekripsi.

Untuk informasi lebih lanjut, lihat Buat kunci.

Langkah 3: Siapkan kredensial akses dan izin

Topik ini menggunakan AccessKey sebagai contoh. Untuk informasi lebih lanjut tentang kredensial akses, lihat Buat kredensial akses.

AccessKey

Peringatan

Secara default, Akun Alibaba Cloud memiliki izin administrator untuk semua resource, yang tidak dapat diubah. Untuk memastikan keamanan resource, kami merekomendasikan agar Anda menggunakan RAM user untuk membuat Pasangan Kunci Akses dan memberikan hanya izin yang diperlukan.

  1. Masuk ke RAM console. Di halaman Users, klik nama RAM user target.

  2. Di tab Credential Management, pada bagian AccessKey, klik Create AccessKey dan ikuti petunjuk di layar.

  3. Berikan izin kepada RAM user untuk mengakses KMS.

    • Metode 1: Konfigurasikan kebijakan berbasis identitas

      Di kolom Actions RAM user, klik Attach Policy untuk menyambungkan kebijakan izin sistem bawaan KMS ke RAM user. Untuk informasi lebih lanjut tentang kebijakan izin sistem KMS, lihat Kebijakan sistem untuk KMS.

      Catatan

      Anda juga dapat membuat kebijakan izin kustom. Untuk informasi lebih lanjut, lihat Buat kebijakan kustom.

    • Metode 2: Konfigurasikan kebijakan berbasis resource

      KMS mendukung kebijakan berbasis resource yang memberikan izin akses untuk kunci dan rahasia tertentu. Anda dapat menggunakan kebijakan ini untuk mengontrol Akun Alibaba Cloud, RAM user, dan RAM role mana yang dapat mengelola atau menggunakan kunci dan rahasia KMS. Untuk informasi lebih lanjut, lihat Kebijakan kunci dan Kebijakan rahasia.

Langkah 4: Dapatkan informasi koneksi dan Sertifikat CA

Saat memanggil API, Anda perlu memilih Titik akhir gateway yang sesuai berdasarkan lingkungan jaringan Anda.

Catatan

Topik ini menggunakan dedicated gateway secara default.

Fitur

Shared gateway

Dedicated gateway

Endpoint

kms.<RegionId>.aliyuncs.com

<YOUR_KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com

Sertifikat CA

Tidak diperlukan.

Diperlukan.

Skenario yang berlaku

Akses publik, pengembangan, dan pengujian.

Akses internal VPC, lingkungan produksi, performa dan isolasi lebih tinggi.

Cara mendapatkan

Untuk informasi lebih lanjut, lihat Alibaba Cloud SDK.

Di halaman detail instans, unduh Sertifikat CA instans dan dapatkan Titik akhir VPC instans.

Skenario aplikasi

Skenario 1: Aplikasi yang dideploy di Alibaba Cloud

Aplikasi yang dideploy di Alibaba Cloud menghasilkan atau menerima data sensitif dalam bentuk teks biasa. Data sensitif tersebut harus dienkripsi sebelum disimpan di database. Kami merekomendasikan penggunaan enkripsi simetris untuk skenario ini.

Operasi API terkait

Operasi API

Deskripsi

Encrypt

Mengenkripsi teks biasa dengan menggunakan kunci simetris.

Decrypt

Mendekripsi ciphertext dengan menggunakan kunci simetris.

Kode contoh

Enkripsi data (Encrypt)

Kode contoh berikut menunjukkan cara memanggil operasi Encrypt untuk mengenkripsi teks biasa menjadi ciphertext dengan menggunakan kunci simetris.

package com.aliyun.sample;

import com.aliyun.kms20160120.Client;
import com.aliyun.kms20160120.models.EncryptRequest;
import com.aliyun.kms20160120.models.EncryptResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class SymmetricEncryptSample {

    public static Client createClient() throws Exception {
        // Inisialisasi client dengan ID AccessKey dan AccessKey Secret yang diperoleh dari Variabel lingkungan.
        // Pastikan Variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET telah disetel.
        Config config = new Config()
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        
        // Setel Titik akhir dedicated gateway.
        config.endpoint = "<Your-KMS-Instance-Endpoint>"; 
        // Setel Sertifikat CA instans KMS.
        config.ca = "<Your-CA-Certificate-Content>";
        
        return new Client(config);
    }

    public static void main(String[] args) throws Exception {
        Client client = createClient();
        
        // Teks biasa yang akan dienkripsi.
        String plaintext = "this is a test message.";
        
        EncryptRequest encryptRequest = new EncryptRequest()
                // Setel ID kunci simetris yang akan digunakan.
                .setKeyId("<Your-Symmetric-Key-Id>")
                // Setel teks biasa yang akan dienkripsi.
                .setPlaintext(plaintext);

        try {
            // Panggil operasi Encrypt.
            EncryptResponse response = client.encryptWithOptions(encryptRequest, new RuntimeOptions());
            
            // Dapatkan ciphertext yang dikodekan Base64 dari respons.
            String ciphertextBlob = response.getBody().getCiphertextBlob();
            
            System.out.println("Plaintext: " + plaintext);
            System.out.println("Ciphertext (Base64): " + ciphertextBlob);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Dekripsi data (Decrypt)

Kode contoh berikut menunjukkan cara memanggil operasi Decrypt untuk mendekripsi ciphertext menjadi teks biasa.

package com.aliyun.sample;

import com.aliyun.kms20160120.Client;
import com.aliyun.kms20160120.models.DecryptRequest;
import com.aliyun.kms20160120.models.DecryptResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class SymmetricDecryptSample {

    public static Client createClient() throws Exception {
        // Logika inisialisasi client sama seperti contoh enkripsi.
        Config config = new Config()
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.endpoint = "<Your-KMS-Instance-Endpoint>";
        config.ca = "<Your-CA-Certificate-Content>";
        return new Client(config);
    }

    public static void main(String[] args) throws Exception {
        Client client = createClient();
        
        // Ciphertext yang akan didekripsi. Harus berupa string yang dikodekan Base64 yang dikembalikan oleh operasi Encrypt.
        String ciphertextBlob = "<Ciphertext-From-Encryption-Step>";
        
        DecryptRequest decryptRequest = new DecryptRequest()
                // Setel ciphertext yang akan didekripsi.
                .setCiphertextBlob(ciphertextBlob);

        try {
            // Panggil operasi Decrypt.
            DecryptResponse response = client.decryptWithOptions(decryptRequest, new RuntimeOptions());
            
            // Dapatkan teks biasa hasil dekripsi dari respons.
            String plaintext = response.getBody().getPlaintext();
            
            System.out.println("Ciphertext (Base64): " + ciphertextBlob);
            System.out.println("Plaintext Hasil Dekripsi: " + plaintext);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Skenario 2: Aplikasi yang dideploy di dalam dan di luar Alibaba Cloud

Kami merekomendasikan penggunaan enkripsi asimetris untuk skenario di mana data dienkripsi di luar Alibaba Cloud dan didekripsi di Alibaba Cloud.

  • Aplikasi yang dideploy di luar Alibaba Cloud menggunakan kunci publik untuk mengenkripsi data dan mengirimkan ciphertext ke aplikasi di Alibaba Cloud.

  • Setelah menerima ciphertext, aplikasi di Alibaba Cloud memanggil instans KMS untuk mendekripsinya dengan menggunakan kunci privat.

Operasi API terkait

Operasi API

Deskripsi

AsymmetricEncrypt

Mengenkripsi data dengan menggunakan kunci asimetris.

AsymmetricDecrypt

Mendekripsi data dengan menggunakan kunci asimetris.

Kode contoh

Enkripsi

package com.aliyun.sample;

import com.aliyun.tea.*;

public class Sample {

    /**
     * deskripsi :
     * <p>Inisialisasi client akun dengan kredensial</p>
     * @return Client
     * 
     * @throws Exception
     */
    public static com.aliyun.kms20160120.Client createClient() throws Exception {
        // Kami merekomendasikan penggunaan metode bebas AK yang lebih aman untuk kode produksi. Untuk konfigurasi kredensial, lihat: https://www.alibabacloud.com/help/document_detail/378657.html.
         com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Wajib. Pastikan Variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID telah disetel.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Wajib. Pastikan Variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET telah disetel.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.endpoint = "kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com";
        //Sertifikat CA instans KMS
        config.ca = "-----BEGIN CERTIFICATE-----MIIDuzCCAqOgAwIBAgIJALTKwWAjvbMiMA0GCS****";
        return new com.aliyun.kms20160120.Client(config);
    }

    public static void main(String[] args) throws Exception {    
        com.aliyun.kms20160120.Client client = Sample.createClient();
         com.aliyun.kms20160120.models.AsymmetricEncryptRequest asymmetricEncryptRequest = new com.aliyun.kms20160120.models.AsymmetricEncryptRequest()
                .setPlaintext("test")
                .setKeyId("a06e2410-*****-330777ee1825")
                .setKeyVersionId("key-hzz65f17868e6cl0n****")
                .setAlgorithm("RSAES_OAEP_SHA_256");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            com.aliyun.kms20160120.models.AsymmetricEncryptResponse resp = client.asymmetricEncryptWithOptions(asymmetricEncryptRequest, runtime);
            System.out.println(new com.google.gson.Gson().toJson(resp));
        } catch (TeaException error) {
            // Ini hanya untuk demonstrasi. Tangani eksepsi dengan hati-hati dan jangan abaikan di lingkungan produksi.
            // Pesan error
            System.out.println(error.getMessage());
            // URL diagnosa
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // Ini hanya untuk demonstrasi. Tangani eksepsi dengan hati-hati dan jangan abaikan di lingkungan produksi.
            // Pesan error
            System.out.println(error.getMessage());
            // URL diagnosa
            System.out.println(error.getData().get("Recommend"));
        }        
    }
}

Dekripsi

public class Sample {
 
    /**
     * deskripsi :
     * <p>Inisialisasi client akun dengan kredensial</p>
     * @return Client
     * 
     * @throws Exception
     */
    public static com.aliyun.kms20160120.Client createClient() throws Exception {
       // Kebocoran kode dapat menyebabkan kebocoran AccessKey dan mengancam keamanan seluruh resource di bawah akun. Kode berikut hanya untuk referensi.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Wajib. Pastikan Variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID telah disetel.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Wajib. Pastikan Variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET telah disetel.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Titik akhir dedicated gateway
        config.endpoint = "kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com";
        //Sertifikat CA instans KMS
        config.ca = "-----BEGIN CERTIFICATE-----MIIDuzCCAqOgAwIBAgIJALTKwWAjvbMiMA0GCS****";
        return new com.aliyun.kms20160120.Client(config);
    }
 
    public static void main(String[] args_) throws Exception {
        
       public static void main(String[] args_) throws Exception {
        
        com.aliyun.kms20160120.Client client = Sample.createClient();
        com.aliyun.kms20160120.models.AsymmetricDecryptRequest asymmetricDecryptRequest = new com.aliyun.kms20160120.models.AsymmetricDecryptRequest()
                .setKeyId("a06e2410-*****-330777ee1825")
                .setKeyVersionId("key-hzz65f17868e6cl0n****")
                .setAlgorithm("RSAES_OAEP_SHA_256")
                .setCiphertextBlob("FV9i23PQdpGPvc*********MA==");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            com.aliyun.kms20160120.models.AsymmetricDecryptResponse resp = client.asymmetricDecryptWithOptions(asymmetricDecryptRequest, runtime);
            System.out.println(new com.google.gson.Gson().toJson(resp));
        } catch (TeaException error) {
            // Ini hanya untuk demonstrasi. Tangani eksepsi dengan hati-hati dan jangan abaikan di lingkungan produksi.
            // Pesan error
            System.out.println(error.getMessage());
            // URL diagnosa
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // Ini hanya untuk demonstrasi. Tangani eksepsi dengan hati-hati dan jangan abaikan di lingkungan produksi.
            // Pesan error
            System.out.println(error.getMessage());
            // URL diagnosa
            System.out.println(error.getData().get("Recommend"));
        }        
    }
}