Konsep enkripsi AEAD

GoogleSQL untuk BigQuery mendukung enkripsi AEAD.

Topik ini menjelaskan konsep di balik enkripsi AEAD di GoogleSQL. Untuk mengetahui deskripsi berbagai fungsi enkripsi AEAD yang didukung GoogleSQL, lihat Fungsi enkripsi AEAD.

Tujuan enkripsi AEAD

BigQuery menjaga keamanan data Anda dengan menggunakan enkripsi dalam penyimpanan. BigQuery juga memberikan dukungan untuk kunci enkripsi yang dikelola pelanggan (CMEK), yang memungkinkan Anda mengenkripsi tabel menggunakan kunci enkripsi tertentu. Namun, dalam beberapa kasus, Anda mungkin ingin mengenkripsi nilai tertentu dalam tabel.

Misalnya, Anda ingin menyimpan data untuk semua pelanggan Anda sendiri dalam tabel yang sama, dan mengenkripsi setiap data pelanggan Anda menggunakan kunci yang berbeda. Anda menyebarkan data di beberapa tabel sehingga dapat melakukan "crypto-delete". Penghapusan kripto, atau penghancuran kripto, adalah proses penghapusan kunci enkripsi untuk merender data apa pun yang dienkripsi dan tidak dapat dibaca menggunakan kunci tersebut.

Fungsi enkripsi AEAD memungkinkan Anda membuat keyset yang berisi kunci untuk enkripsi dan dekripsi, menggunakan kunci ini untuk mengenkripsi dan mendekripsi setiap nilai dalam tabel, serta merotasi kunci dalam keyset.

Keyset

Keyset adalah kumpulan kunci kriptografis, salah satunya adalah kunci kriptografis utama dan yang lainnya, jika ada, adalah kunci kriptografis sekunder. Setiap kunci mengenkode algoritma untuk enkripsi atau dekripsi; apakah kunci diaktifkan, dinonaktifkan, atau dihancurkan; dan, untuk kunci yang tidak dihancurkan, byte kunci itu sendiri. Kunci kriptografis utama akan menentukan cara mengenkripsi teks biasa input. Kunci kriptografis utama tidak dapat disetel statusnya menjadi nonaktif. Kunci kriptografis sekunder hanya ditujukan untuk dekripsi dan dapat disetelnya statusnya ke aktif atau nonaktif. Keyset dapat digunakan untuk mendekripsi data apa pun yang digunakan untuk melakukan enkripsi.

Representasi keyset dalam GoogleSQL adalah sebagai buffering protokol google.crypto.tink.Keyset yang diserialisasi di BYTES.

Contoh

Berikut contoh keyset AEAD, yang direpresentasikan sebagai string JSON, dengan tiga kunci.

{
  "primaryKeyId": 569259624,
  "key": [
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiDPhTp5gIhfnDb6jfKOT4SmNoriIJc7ah8uRvrCpdNihA==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "ENABLED",
      "keyId": 569259624,
      "outputPrefixType": "TINK"
    },
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiBp6aU2cFbVfTh9dTQ1F0fqM+sGHXc56RDPryjAnzTe2A==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "DISABLED",
      "keyId": 852264701,
      "outputPrefixType": "TINK"
    },
    {
      "status": "DESTROYED",
      "keyId": 237910588,
      "outputPrefixType": "TINK"
    }
  ]
}

Pada contoh di atas, kunci kriptografis utama memiliki ID 569259624 dan merupakan kunci pertama yang tercantum dalam string JSON. Ada dua kunci kriptografis sekunder, satu dengan ID 852264701 dalam status nonaktif, dan satu lagi dengan ID 237910588 dalam status hancur. Jika fungsi enkripsi AEAD menggunakan keyset ini untuk enkripsi, ciphertext yang dihasilkan akan mengenkode ID kunci kriptografis utama 569259624.

Jika fungsi AEAD menggunakan keyset ini untuk dekripsi, fungsi tersebut akan memilih kunci yang sesuai untuk dekripsi berdasarkan ID kunci yang dienkode dalam ciphertext. Dalam contoh di atas, mencoba melakukan dekripsi menggunakan salah satu ID kunci 852264701 atau 237910588 akan mengakibatkan error, karena ID kunci 852264701 dinonaktifkan dan ID 237910588 dihancurkan. Memulihkan ID kunci 852264701 ke status aktif akan merendernya sehingga dapat digunakan untuk dekripsi.

Jenis kunci menentukan mode enkripsi yang akan digunakan dengan kunci tersebut.

Mengenkripsi teks biasa lebih dari sekali menggunakan keyset yang sama umumnya akan menampilkan nilai ciphertext yang berbeda karena vektor inisialisasi (IV) yang berbeda, yang dipilih menggunakan generator angka pseudo-random yang disediakan oleh OpenSSL.

Keyset yang digabungkan

Jika Anda perlu mengelola keyset dengan aman atau mengirimkannya melalui saluran yang tidak tepercaya, coba gunakan keyset yang digabungkan. Saat Anda menggabungkan keyset mentah, proses ini akan mengenkripsi keyset mentah menggunakan kunci Cloud KMS.

Keyset yang digabungkan dapat mengenkripsi dan mendekripsi data tanpa mengekspos data keyset. Meskipun mungkin ada cara lain untuk membatasi akses ke data level kolom, keyset yang digabungkan memberikan mekanisme yang lebih aman untuk pengelolaan keyset dibandingkan dengan keyset mentah.

Seperti pada keyset, keyset yang digabungkan dapat, dan harus, dirotasi secara berkala. Keyset gabungan digunakan dalam fungsi enkripsi amplop AEAD.

Berikut beberapa fungsi dengan contoh keyset yang digabungkan:

Advanced Encryption Standard (AES)

Fungsi enkripsi AEAD menggunakan enkripsi Advanced Encryption Standard (AES). Enkripsi AES akan mengambil teks biasa sebagai input, serta kunci kriptografis, dan menampilkan urutan byte terenkripsi sebagai output. Urutan byte ini nantinya dapat didekripsi menggunakan kunci yang sama dengan yang digunakan untuk mengenkripsinya. AES menggunakan ukuran blok 16 byte, yang berarti bahwa teks biasa diperlakukan sebagai urutan blok 16 byte. Ciphertext tersebut akan berisi imbuhan khusus Tink yang menunjukkan kunci yang digunakan untuk melakukan enkripsi. Enkripsi AES mendukung beberapa mode block cipher.

Mode block cipher

Dua mode block cipher yang didukung oleh fungsi enkripsi AEAD adalah GCM dan CBC.

GCM

Galois/Counter Mode (GCM) adalah mode untuk enkripsi AES. Nomor fungsi akan melakukan pemblokiran secara berurutan, lalu menggabungkan nomor blok ini dengan vektor inisialisasi (IV). Vektor inisialisasi adalah nilai acak atau pseudo-random yang membentuk dasar dari pengacakan data teks biasa. Selanjutnya, fungsi akan mengenkripsi kombinasi nomor blok dan IV menggunakan AES. Lalu, fungsi tersebut melakukan operasi bitwise logical eksklusif atau (XOR) pada hasil enkripsi dan teks biasa untuk menghasilkan ciphertext. Mode GCM menggunakan kunci kriptografis dengan panjang 128 atau 256 bit.

Mode CBC

CBC "rantai" memblokir setiap blok teks biasa dengan blok ciphertext sebelumnya agar dapat mengenkripsinya. Mode CBC menggunakan kunci kriptografis dengan panjang 128, 192, atau 256 bit. CBC menggunakan vektor inisialisasi 16 byte sebagai blok awal dan melakukan XOR untuk blok ini dengan blok teks biasa pertama.

Mode CBC bukanlah skema AEAD dalam arti kriptografis karena tidak memberikan integritas data. Dengan kata lain, modifikasi berbahaya pada data terenkripsi tidak akan terdeteksi, yang juga mengganggu kerahasiaan data. Oleh karena itu, CBC tidak direkomendasikan kecuali jika diperlukan karena alasan lama.

Data tambahan

Fungsi enkripsi AEAD mendukung penggunaan argumen additional_data, yang juga dikenal sebagai data terkait (AD) atau data terautentikasi tambahan. Ciphertext hanya dapat didekripsi jika data sama lain yang digunakan untuk melakukan enkripsi juga disediakan untuk didekripsi. Data tambahan dapat digunakan untuk mengikat ciphertext ke suatu konteks.

Misalnya, additional_data dapat menjadi output CAST(customer_id AS STRING) saat mengenkripsi data untuk pelanggan tertentu. Hal ini memastikan bahwa saat data didekripsi, data tersebut sebelumnya dienkripsi menggunakan customer_id yang diharapkan. Nilai additional_data yang sama diperlukan untuk dekripsi. Untuk mengetahui informasi selengkapnya, lihat RFC 5116.

Dekripsi

Output AEAD.ENCRYPT adalah ciphertext BYTES. Fungsi AEAD.DECRYPT_STRING atau AEAD.DECRYPT_BYTES dapat mendekripsi ciphertext ini. Fungsi ini harus menggunakan keyset yang berisi kunci yang digunakan untuk enkripsi. Kunci tersebut harus berada dalam status 'ENABLED'. Fungsi tersebut juga harus menggunakan additional_data yang sama seperti yang digunakan dalam enkripsi.

Jika keyset digunakan untuk dekripsi, kunci yang sesuai akan dipilih untuk dekripsi berdasarkan ID kunci yang dienkode dalam ciphertext.

Output AEAD.DECRYPT_STRING adalah teks biasa STRING, sedangkan output dari AEAD.DECRYPT_BYTES adalah teks biasa BYTES. AEAD.DECRYPT_STRING dapat mendekripsi teks sandi yang mengenkode nilai STRING. AEAD.DECRYPT_BYTES dapat mendekripsi ciphertext yang mengenkode nilai BYTES. Penggunaan salah satu fungsi ini untuk mendekripsi ciphertext yang mengenkode jenis data yang salah, seperti menggunakan AEAD.DECRYPT_STRING untuk mendekripsi ciphertext yang mengenkode sebuah BYTES bernilai, menyebabkan perilaku yang tidak terdefinisi dan dapat mengakibatkan error.

Rotasi kunci

Tujuan utama dari merotasi kunci enkripsi adalah untuk mengurangi jumlah data yang dienkripsi dengan kunci tertentu, sehingga kunci yang berpotensi disusupi yang memungkinkan penyerang mengakses lebih sedikit data.

Rotasi keyset mencakup:

  1. Membuat kunci kriptografis utama yang baru dalam setiap keyset.
  2. Mendekripsi dan mengenkripsi ulang semua data yang telah dienkripsi.

Fungsi KEYS.ROTATE_KEYSET atau KEYS.ROTATE_WRAPPED_KEYSET melakukan langkah pertama, dengan menambahkan kunci kriptografis utama baru ke keyset dan mengubah kunci kriptografis utama yang lama menjadi kunci kriptografis sekunder.

Kunci Cloud KMS

GoogleSQL mendukung fungsi enkripsi AEAD dengan kunci Cloud KMS untuk mengamankan lebih lanjut data Anda. Lapisan perlindungan tambahan ini akan mengenkripsi kunci enkripsi data (DEK) dengan kunci enkripsi kunci (KEK). KEK adalah keyset enkripsi simetris yang disimpan dengan aman di Cloud Key Management Service dan dikelola menggunakan izin dan peran Cloud KMS.

Saat eksekusi kueri, gunakan fungsi KEYS.KEYSET_CHAIN untuk menyediakan jalur resource KMS KEK dan ciphertext dari DEK yang digabungkan. BigQuery akan memanggil Cloud KMS untuk memisahkan DEK, lalu menggunakan kunci tersebut untuk mendekripsi data dalam kueri Anda. Versi DEK yang dipisah hanya akan disimpan dalam memori selama durasi kueri, lalu dihancurkan.

Untuk mengetahui informasi selengkapnya, lihat Enkripsi level kolom SQL dengan kunci Cloud KMS.