cara encrypt dan decrypt data di pyspark

Cara Encrypt dan Decrypt Data di PySpark

Pada artikel ini, kita akan mengerjakan dua metode berbeda untuk mengenkripsi data ini sehingga tidak dapat jatuh ke tangan pengguna yang tidak sah. Kita akan melihat bagaimana kita dapat encrypt dan decrypt data sensitif menggunakan PySpark.

Berbagi data menjadi sangat mudah hari ini dan kita dapat membagikan detailnya hanya dengan beberapa klik. Misalnya, untuk mengakses layanan, kita perlu membagikan detail penting seperti ID email, nomor telepon, nomor jaminan sosial, dll.

Detail ini dapat bocor jika penyedia layanan tidak mengikuti metodologi perlindungan data yang kuat. Banyak pelanggaran data terjadi karena kelalaian atau tidak disengaja, yang dapat berdampak pada pengguna secara pribadi, profesional, atau ekonomi. Kita memiliki id email, nomor telepon, dan kartu yang dikeluarkan pemerintah, yang bersifat sensitif dan rahasia. Kita harus melindungi mereka agar mereka tidak jatuh ke tangan yang salah.

Mengapa Kita Butuh Untuk Enkripsi Data?

Enkripsi data sangat penting dalam beberapa konteks. Misalkan sebuah organisasi yang berurusan dengan klien yang berbeda harus berbagi data untuk memberikan layanan kepada mereka. Klien membagikan detail rahasia mereka dengan perusahaan seperti database mereka, info pelanggan, produk yang mereka jual atau beli, dll.

Semua detail ini sensitif dan harus dilindungi agar tidak jatuh ke tangan yang salah. Jika individu yang tidak berwenang mengakses data ini, hal itu dapat menyebabkan konsekuensi yang parah seperti kerugian finansial, kerusakan reputasi, atau bahkan tanggung jawab hukum.

Jadi enkripsi data membantu kita dalam melindungi informasi sensitif dan rahasia. Oleh karena itu, hal ini merupakan aspek yang sangat penting dari keamanan data.

Membuat Data Frame

Untuk melakukan enkripsi dan dekripsi, kami memerlukan data sampel dengan informasi penting seperti id email pengguna, nomor telepon, nomor jaminan sosial, alamat, dll. Sebelum mengirim detail ini ke pengguna, detail tersebut harus dienkripsi. Jadi, kita akan membuat kerangka data sampel yang memiliki informasi ini. Kerangka data memiliki empat kolom bernama ‘customer_name’, ‘mail_id’, ‘phone_num’, dan ‘social_security_number’. Deskripsi kolom adalah sebagai berikut:

  • customer_name: Kolom ini berisi nama pelanggan.
  • mail_id: Kolom ini memiliki informasi email pelanggan.
  • phone_num: Kolom ini berisi data nomor ponsel pelanggan.
  • social_security_number: Kolom ini memiliki informasi nomor jaminan sosial yang dikeluarkan pemerintah pelanggan.
# import necessary libs
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, LongType, StringType

# create a SparkSession
spark = SparkSession.builder.appName("demo").getOrCreate()

# define the schema for the DataFrame
schema = StructType([
        StructField("customer_name", StringType(), True),
        StructField("mail_id", StringType(), True),
        StructField("mobile_num", LongType(), True),
        StructField("social_security_number", StringType(), True)
])

# create the sample data
data = [ ("Max", '[email protected]', 9789457864, '7548-8546-4512'),
("Michael", '[email protected]', 9089848243, '7845-8745-8756'),
("Alex", '[email protected]', 9589848643, '3245-6547-9854'),
("Hector", '[email protected]', 9189648245, '6547-7845-2150')
]

# create the DataFrame
df = spark.createDataFrame(data, schema)
df.show()

Ketika kita menjalankan code diatas akan terdapat tabel yang berisi data informasi pribadi pengguna, seperti nama, email, nomor ponsel, dan nomor jaminan sosial sehingga tidak dapat dibagikan secara langsung dengan orang atau organisasi lain mana pun. Untuk membagikan detail ini, kita harus mengenkripsi dan mengirim data ini. Di sisi lain, penerima dapat mendekripsi data ini dengan kuncinya.

Menggunakan Fungsi aes_encrypt dan aes_decrypt

Kita akan bekerja dengan fungsi bawaan untuk mengenkripsi data kerangka data di atas. Kita akan menggunakan fungsi aes_encrypt untuk mengenkripsi kolom ‘mail_id’, ‘mobile_num’, dan ‘social_security_number’. Nanti kita akan menggunakan fungsi aes_decrypt untuk mendekripsi data yang dienkripsi. Nilai data yang didekodekan akan dibandingkan dengan nilai asli untuk dekripsi yang berhasil.

aes_encrypt() – Fungsi ini mengenkripsi teks biasa. Dalam hal ini, kita akan meneruskan nama kolom yang datanya perlu dienkripsi di dalam argumen expr. Kemudian kita memberikan kunci untuk mendekripsi data yang dienkripsi. Selanjutnya, kita meneruskan nilai argumen mode dan, terakhir, nilai padding. Output dari fungsi ini adalah nilai terenkripsi.

Fungsi ini akan mengambil argumen berikut sebagai masukan:

  • ‘expr’ – Nilai biner untuk mengenkripsi data.
  • ‘key’ – Nilai frasa sandi yang digunakan untuk mengenkripsi data.
  • ‘mode’ – Pilih mode sandi blok untuk mengenkripsi pesan. Mode yang valid adalah ECB dan GCM.
  • ‘padding’ – Digunakan untuk melapisi pesan yang panjangnya tidak dalam kelipatan ukuran blok. Nilai yang valid adalah PKCS, NONE, dan DEFAULT. Padding DEFAULT berarti PKCS untuk ECB dan NONE untuk GCM.

Sintaks dari fungsi ini adalah aes_encrypt(expr, key[, mode[, padding]]). Output dari fungsi ini akan menjadi nilai data yang dienkripsi. Fungsi ini mendukung panjang kunci 16, 24, dan 32 bit. Mode default adalah GCM.

Sekarang kita akan meneruskan nama kolom dalam fungsi expr untuk mengenkripsi nilai data. Nama kolom yang datanya akan kami enkripsi adalah ‘mail_id’, ‘mobile_num’, dan ‘social_security_num’. Kami akan menyimpan data terenkripsi dalam kerangka data baru.

enc_df = df.withColumn('encrypted_mail', expr("base64(aes_encrypt(mail_id, '1234567890abcdef', 'ECB', 'PKCS'))"))
           .withColumn('encrypted_mobile_num', expr("base64(aes_encrypt(mobile_num, '1234567890abcdgh', 'ECB', 'PKCS'))"))
           .withColumn('encrypted_ssn', expr("base64(aes_encrypt(social_security_number, '1234567890abcdij', 'ECB', 'PKCS'))"))
enc_df.show()

Dalam hal ini, kita telah membuat nama kolom baru menggunakan fungsi ‘withColumn’; di dalamnya. Kita juga telah memasukkan nama kolom dalam fungsi expr.

Disini kita menggunakan ‘1234567890abcdef’ sebagai kunci enkripsi untuk mengenkripsi data ‘mail_id’. ECB adalah modenya, dan PKCS sangat membantu untuk padding. Hal yang sama berlaku untuk dua kolom lainnya. Hanya kuncinya saja yang berbeda. Selain itu, kita juga menggunakan konversi ‘base64’ untuk mengonversi data byte menjadi string teks.

Selamat, kita telah memiliki data terenkripsi dan sekarang kita akan melihat cara mendekripsi data ini dan mendapatkan kembali data aslinya.

aes_decrypt()– Kami menggunakan fungsi ini untuk mendekripsi nilai data. Dalam hal ini, kami meneruskan informasi kolom data yang datanya perlu didekode. Ini akan mengembalikan nilai data yang didekodekan sebagai hasil akhir.

Fungsi ini akan mengambil argumen berikut sebagai masukan:

  • ‘expr’ – Nilai biner untuk mendekripsi data.
  • ‘key’ – Nilai frasa sandi yang digunakan untuk mendekripsi data.
  • ‘mode’ – Pilih mode sandi blok untuk mendekripsi pesan. Mode yang valid: ECB, GCM.
  • ‘padding’ – Digunakan untuk melapisi pesan yang panjangnya tidak dalam kelipatan ukuran blok. Nilai yang valid adalah PKCS, NONE, dan DEFAULT. Padding DEFAULT berarti PKCS untuk ECB dan NONE untuk GCM.

Sintaks dari fungsi ini adalah aes_decrypt(expr, key[, mode[, padding]]). Output dari fungsi ini akan didekripsi nilai data aslinya. Fungsi ini mendukung panjang kunci 16, 24, dan 32 bit. Sekarang kita telah berhasil melakukan encrypt dan decrypt data menggunakan fungsi aes_encrypt() dan aes_decrypt().

Menggunakan Library Cryptography

Sekarang kita akan menggunakan library cryptography untuk melakukan encrypt dan decrypt data. Dalam hal ini, kita akan membuat fungsi yang ditentukan pengguna (udf) yang akan mengambil data dan menyelesaikan enkripsi dan dekripsi.

# import necessary libs
from pyspark.sql.functions import udf, lit, col
from cryptography.fernet import Fernet

# encrypt func
def encrypt_data(plain_text, KEY):
    f = Fernet(KEY)
    encrip_text = f.encrypt(str(palin_text).encode()).decode()
    return encrp_text
encrypt_udf = udf(encrypt_val, StringType())

# generate the encryption key
Key = Fernet.generate_key()

# encrypt the 'mail_id', 'mobile_num', and 'social_security_number' cols
enc_df = df.withColumn("encrypted_mail_id", encrypt(col('mail_id'), lit(Key))) 
           .withColumn("encrypted_mobile_num", encrypt(col('mobile_num'), lit(Key))) 
           .withColumn("encrypted_ssn", encrypt(col('social_security_number'), lit(Key)))
enc_df.show()

Dalam hal ini, kita harus membuat kunci untuk mengenkripsi data menggunakan pustaka cryptography, lalu meneruskan kolom yang ingin kita enkripsi, dan meneruskan kunci enkripsi bersamanya. Sekarang kita bisa melihat hasil terenkripsi.

Selanjutnya, kita akan melihat cara mendekripsi kolom terenkripsi ini untuk mendapatkan kembali nilai aslinya.

def decrypt_data(encrypt_data, KEY):
    f = Fernet(bytes(KEY))
    decoded_val = f.decrypt(encrypt_data.encode()).decode()
    return decoded_val
decrypt_udf = udf(decrypt_data, StringType())
# decrypt the data
dec_df = enc_df.withColumn("decrypted_mail_id", decrypt_udf(col('encrypted_mail_id'), lit(Key))) 
             .withColumn("decrypted_mobile_num", decrypt_udf(col('encrypted_mobile_num'), lit(Key))) 
             .withColumn("decrypted_ssn", decrypt_udf(col('encrypted_ssn'), lit(Key))) 
             .drop('mail_id', 'mobile_num', 'social_security_number')
dec_df.show()

Dalam hal ini, kita telah berhasil mendekripsi data dan mendapatkan kembali data asli kami. Kita sekarang dapat melihat hasil nilai aslinya kembali.

Penutup

Pada artikel ini, kita telah membahas dua metode untuk encrypt dan decrypt data. Dengan melakukannya, kita dapat memastikan bahwa data tetap aman dan terlindung dari akses tidak sah. Di PySpark, kita dapat mencapainya dengan mengikuti dua metode di atas dan melindungi data kita secara efisien.

Dalam hal ini, kita telah menulis fungsi yang ditentukan pengguna (udf) dan kemudian menggunakan fungsi ini untuk melakukan enkripsi data.

Artikel ini membantu kalian dalam melakukan enkripsi dan dekripsi di PySpark. Jika kalian memiliki pendapat atau pertanyaan, maka beri komentar di bawah.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top