ゼファーネットのロゴ

PySpark でデータを暗号化および復号化する方法は?

日付:

この記事は、の一部として公開されました データサイエンスブログソン.

概要

現在、データ共有は非常に簡単で、数回クリックするだけで詳細を共有できます。 サービスにアクセスするには、メール ID、電話番号、社会保障番号などの重要な詳細を共有する必要があります。サービス プロバイダーが堅牢なデータ保護方法に従わない場合、これらの詳細が漏洩する可能性があります。 多くのデータ侵害は、過失または偶発的な露出が原因で発生し、ユーザーに個人的、職業的、または経済的に影響を与える可能性があります. メール ID、電話番号、政府発行のカードがあり、これらのデータは影響を受けやすく、機密情報です。 彼らが悪人の手に渡らないように、私たちは彼らを守らなければなりません。

この記事では、これらのデータを暗号化して、権限のないユーザーの手に渡らないようにするための XNUMX つの異なる方法について説明します。 PySpark を使用して機密データを暗号化および復号化する方法を確認します。

データを暗号化する
出典:Canva

データ暗号化が必要な理由

データの暗号化は、いくつかのコンテキストで不可欠です。 さまざまなクライアントを扱う組織が、サービスを提供するためにデータを共有する必要があるとします。 クライアントは、データベース、顧客情報、販売または購入する製品などの機密情報を企業と共有します。

これらすべての詳細は影響を受けやすく、悪意のある人の手に渡らないように保護する必要があります。 許可されていない個人がこれらのデータにアクセスすると、経済的損失、風評被害、さらには法的責任などの重大な結果につながる可能性があります。

したがって、データの暗号化は、機密情報や機密情報を保護するのに役立ちます。 これは、データ セキュリティの非常に重要な側面です。

データを暗号化する
出典:Canva

データ フレームの作成

暗号化と復号化を実行するには、ユーザーの電子メール ID、電話番号、社会保障番号、住所などの重要な情報を含むサンプル データが必要です。これらの詳細をユーザーに送信する前に、暗号化する必要があります。 したがって、この情報を持つサンプル データフレームを作成します。 データフレームには、「customer_name」、「mail_id」、「phone_num」、および「social_security_number」という名前の XNUMX つの列があります。 列の説明は次のとおりです。

  • 顧客名:- この列には顧客の名前が含まれます。
  • メール ID:- この列には顧客の電子メール情報があります。
  • 電話番号:- この列には、顧客の携帯電話番号のデータがあります。
  • 社会保障番号:- この列には、顧客の政府発行の社会保障番号情報が含まれています。
# pyspark.sql から必要なライブラリをインポートする import SparkSession from pyspark.sql.types import StructType, StructField, LongType, StringType # SparkSession を作成する spark = SparkSession.builder.appName("demo").getOrCreate() # のスキーマを定義するDataFrame スキーマ = StructType([ StructField("customer_name", StringType(), True), StructField("mail_id", StringType(), True), StructField("mobile_num", LongType(), True), StructField("social_security_number" , StringType(), True) ]) # サンプルデータを作成 data = [ ("Max", '[メール保護]'、9789457864、'7548-8546-4512')、("マイケル"、'[メール保護]'、9089848243、'7845-8745-8756')、("アレックス"、'[メール保護]'、9589848643、'3245-6547-9854')、("ヘクター"、'[メール保護]', 9189648245, '6547-7845-2150') ] # DataFrame を作成します df = spark.createDataFrame(data, schema) df.show()

上記のデータフレームの出力は次のようになります。

+-------------+-------------------+----------+---- ------------------+ |顧客名| mail_id|mobile_num|social_security_number| +-------------+-------------------+----------+---- ------------------+ | マックス| [メール保護]|9789457864| 7548-8546-4512| | | マイケル|[メール保護]|9089848243| 7845-8745-8756| | | アレックス|[メール保護]|9589848643| 3245-6547-9854| | | ヘクター|[メール保護]|9189648245| 6547-7845-2150| +-------------+-------------------+----------+---- ------------------+

名前、電子メール、携帯電話番号、社会保障番号などの上記のデータはユーザーの個人情報であり、他の個人や組織と直接共有することはできません。 これらの詳細を共有するには、このデータを暗号化して送信する必要があります。 一方、受信者はこのデータをキーで復号化できます。

aes_encrypt および aes_decrypt 関数の使用

組み込み関数を使用して、上記のデータフレーム データを暗号化します。 aes_encrypt 関数を使用して、「mail_id」、「mobile_num」、および「social_security_number」列を暗号化します。 後で、aes_decrypt 関数を使用して、暗号化されたデータを復号化します。 デコードされたデータ値は、正常な復号化のために元の値と比較されます。

aes_encrypt() – この関数はプレーン テキストを暗号化します。 ここでは、expr 引数内でデータを暗号化する必要がある列名を渡します。 次に、暗号化されたデータを復号化するためのキーを提供します。 次にモード引数値を渡し、最後にパディング値を渡します。 この関数の出力は、暗号化された値です。

この関数は、次の引数を入力として受け取ります:-

  • 「式」 – データを暗号化するバイナリ値。
  • '鍵' – データの暗号化に使用するパスフレーズ値。
  • 'モード' – ブロック暗号モードを選択して、メッセージを暗号化します。 有効なモードは ECB と GCM です。
  • 「パディング」 – 長さがブロック サイズの倍数でないメッセージを埋め込むために使用されます。 有効な値は、PKCS、NONE、および DEFAULT です。 DEFAULT パディングは、ECB の場合は PKCS、GCM の場合は NONE を意味します。

この関数の構文は aes_encrypt(expr、キー[、モード[、パディング]])。 この関数の出力は、暗号化されたデータ値になります。 この関数は、16、24、および 32 ビットのキー長をサポートします。 デフォルトのモードは GCM です。

ここで、列名を expr 関数に渡して、データ値を暗号化します。 暗号化するデータの列名は、「mail_id」、「mobile_num」、および「social_security_num」です。 暗号化されたデータを新しいデータフレームに保存します。

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 。公演()

ここでは、「withColumn」関数を使用して新しい列名を作成しました。 その中で、列名を expr 関数に渡しました。 「mail_id」データを暗号化するための暗号化キーとして「1234567890abcdef」を使用しました。 ECB はモードであり、PKCS はパディングに役立ちます。 他の 64 つの列についても同じことが言えます。 キーのみが異なります。 ここでも「baseXNUMX」変換を使用して、バイト データをテキスト文字列に変換しました。

これで、次のような暗号化されたデータを取得できます。

+-------------+-------------------+----------+---- ------+--------------------+---------------------- ----------+--------------------+ |顧客名| mail_id|mobile_num|social_security_number| encrypted_mail|encrypted_mobile_num| encrypted_ssn| +-------------+-------------------+----------+---- ------+--------------------+---------------------- ----------+--------------------+ | マックス| [メール保護]|9789457864| 7548-8546-4512|sk33JvRxTV9PU11qw...|4DF70TSV5/k2f7XDy...|kruqxwUhDD582Q4mf...|
| Michael|[メール保護]|9089848243| 7845-8745-8756|RzIRtA7ihZG7YlRj9...|eaMgFEdzEkqz7b6+Q...|QvfthH7TQqL6aJNp6...|
| Alex|[メール保護]|9589848643| 3245-6547-9854|ZahqBXBlprhgNfTyU...|msPEyWULCkIhbtel0...|1Majk18XVhQIJ10J5...|
| Hector|[メール保護]|9189648245| 6547-7845-2150|O3JpFSx0DGqs+XSIO...|647cANlvcGS4rwwVU...|cMH3zNTAgq8RmHL5R...|
+-------------+-------------------+----------+----------------------+--------------------+--------------------+--------------------+

暗号化されたデータができたので、このデータを復号化して元のデータを取り戻す方法を見ていきます。

aes_decrypt()- この関数を使用して、データ値を復号化します。 これで、データをデコードする必要があるデータ列情報を渡します。 デコードされたデータ値を最終出力として返します。

この関数は、次の引数を入力として受け取ります:-

  • 「式」 – データを復号化するためのバイナリ値。
  • '鍵' – データの復号化に使用するパスフレーズ値。
  • 'モード' – ブロック暗号モードを選択して、メッセージを復号化します。 有効なモード: ECB、GCM。
  • 「パディング」 – 長さがブロック サイズの倍数でないメッセージを埋め込むために使用されます。 有効な値は、PKCS、NONE、および DEFAULT です。 DEFAULT パディングは、ECB の場合は PKCS、GCM の場合は NONE を意味します。

この関数の構文は aes_decrypt(expr、キー[、モード[、パディング]])。 この関数の出力は、復号化された元のデータ値になります。 この関数は、16、24、および 32 ビットのキー長をサポートします。

次に、暗号化されたデータ列をこの関数に渡し、結果を元のデータと比較します。

# 元データ +-------------+-------------------+----------+- ----------------------+ |顧客名| mail_id|mobile_num|social_security_number| +-------------+-------------------+----------+---- ------------------+ | マックス| [メール保護]|9789457864| 7548-8546-4512| | | マイケル|[メール保護]|9089848243| 7845-8745-8756| | | アレックス|[メール保護]|9589848643| 3245-6547-9854| | | ヘクター|[メール保護]|9189648245| 6547-7845-2150| +-------------+-------------------+----------+---- ------------------+
# encrypted data
+-------------+--------------------+--------------------+--------------------+
|customer_name| encrypted_mail|encrypted_mobile_num| encrypted_ssn|
+-------------+--------------------+--------------------+--------------------+
| Max|sk33JvRxTV9PU11qw...|4DF70TSV5/k2f7XDy...|kruqxwUhDD582Q4mf...|
| Michael|RzIRtA7ihZG7YlRj9...|eaMgFEdzEkqz7b6+Q...|QvfthH7TQqL6aJNp6...|
| Alex|ZahqBXBlprhgNfTyU...|msPEyWULCkIhbtel0...|1Majk18XVhQIJ10J5...|
| Hector|O3JpFSx0DGqs+XSIO...|647cANlvcGS4rwwVU...|cMH3zNTAgq8RmHL5R...|
+-------------+--------------------+--------------------+--------------------+
# 復号化されたデータ +-------------+-------------------+------------ --------+--------------+ |顧客名| decrypted_mail|decrypted_mobile_num| 復号化された_ssn| +-------------+-------------------+--------------- ---+--------------+ | マックス| [メール保護]| | 9789457864|7548-8546-4512| | | マイケル|[メール保護]| | 9089848243|7845-8745-8756| | | アレックス|[メール保護]| | 9589848643|3245-6547-9854| | | ヘクター|[メール保護]| | 9189648245|6547-7845-2150| +-------------+-------------------+--------------- ---+--------------+

暗号化ライブラリの使用

次に、暗号化ライブラリを使用して暗号化と復号化を実行します。 ここでは、データを取得して暗号化と復号化を完了するユーザー定義関数 (udf) を作成します。

暗号化 –

# 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()) # 暗号化キーを生成します Key = Fernet.generate_key() # 'mail_id'、'mobile_num'、および '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()

この場合、暗号化ライブラリを使用してデータを暗号化するためのキーを生成し、暗号化する列を渡し、暗号化キーを一緒に渡す必要があります。 これで、暗号化された結果が表示されます。

+-------------+-------------------+----------+---- ------+--------------------+---------------------- ----------+--------------------+ |顧客名| mail_id|mobile_num|social_security_number| encrypted_mail_id|encrypted_mobile_num| encrypted_ssn| +-------------+-------------------+----------+---- ------+--------------------+---------------------- ----------+--------------------+ | マックス| [メール保護]|9789457864| 7548-8546-4512|gAAAAABjpED66V3Xw...|gAAAAABjpED6oaixb...|gAAAAABjpED6TWeAg...|
| Michael|[メール保護]|9089848243| 7845-8745-8756|gAAAAABjpED7nVl6j...|gAAAAABjpED77xy8P...|gAAAAABjpED7D73yg...|
| Alex|[メール保護]|9589848643| 3245-6547-9854|gAAAAABjpED7Iuq5N...|gAAAAABjpED73BQYd...|gAAAAABjpED7OjE8W...|
| Hector|[メール保護]|9189648245| 6547-7845-2150|gAAAAABjpED7sT3Tz...|gAAAAABjpED7lH29J...|gAAAAABjpED7SXANT...|
+-------------+-------------------+----------+----------------------+--------------------+--------------------+--------------------+

したがって、「email_id」、「mobile_num」、および「social_security_num」は暗号化されます。

ここで、これらの暗号化された列を復号化して元の値を取得する方法を見ていきます。

解読中-

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()) # データを復号化します 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("復号化された_ssn"、decrypt_udf(col('encrypted_ssn'), lit(Key))) .drop('mail_id', 'mobile_num', 'social_security_number') dec_df.show()

これで、データの復号化に成功し、元のデータを取り戻しました。 結果を確認し、実際のデータと比較できます。

# 元のデータと暗号化されたデータ +-------------+-------------------+---------- +---------------------+--------------------+----- ---------------+--------------------+ |顧客名| mail_id|mobile_num|social_security_number| encrypted_mail_id|encrypted_mobile_num| encrypted_ssn| +-------------+-------------------+----------+---- ------+--------------------+---------------------- ----------+--------------------+ | マックス| [メール保護]|9789457864| 7548-8546-4512|gAAAAABjpED66V3Xw...|gAAAAABjpED6oaixb...|gAAAAABjpED6TWeAg...|
| Michael|[メール保護]|9089848243| 7845-8745-8756|gAAAAABjpED7nVl6j...|gAAAAABjpED77xy8P...|gAAAAABjpED7D73yg...|
| Alex|[メール保護]|9589848643| 3245-6547-9854|gAAAAABjpED7Iuq5N...|gAAAAABjpED73BQYd...|gAAAAABjpED7OjE8W...|
| Hector|[メール保護]|9189648245| 6547-7845-2150|gAAAAABjpED7sT3Tz...|gAAAAABjpED7lH29J...|gAAAAABjpED7SXANT...|
+-------------+-------------------+----------+----------------------+--------------------+--------------------+--------------------+
# 復号化されたデータ +-------------+--------------------+----------- ------+--------------------+---------------------- +--------------------+--------------+ |顧客名| encrypted_mail_id|encrypted_mobile_num| encrypted_ssn| decrypted_mail_id|decrypted_mobile_num| 復号化された_ssn| +-------------+--------------------+-------------- ------+--------------------+-------------------+-- --------------+--------------+ | Max|gAAAAABjpEE9TcrVL...|gAAAAABjpEE907red...|gAAAAABjpEE92mIuZ...| [メール保護]| 9789457864|7548-8546-4512|
| Michael|gAAAAABjpEE9UXJF6...|gAAAAABjpEE9OlqYJ...|gAAAAABjpEE9TV8rm...|[メール保護]| 9089848243|7845-8745-8756|
| Alex|gAAAAABjpEE93b3z_...|gAAAAABjpEE9knvQ7...|gAAAAABjpEE9rXc4g...|[メール保護]| 9589848643|3245-6547-9854|
| Hector|gAAAAABjpEE9bbV1Z...|gAAAAABjpEE9DfOWj...|gAAAAABjpEE9Lvw6g...|[メール保護]| | 9189648245|6547-7845-2150| +-------------+--------------------+-------------- ------+--------------------+-------------------+-- --------------+--------------+

Note:- 暗号化とハッシュは別物です。 ハッシュは、一度行うと元のデータに戻すことはできません。 同時に、エンコードされた値を後でデコードして、実際のデータ値を取得できます。

まとめ

この記事では、共有中にデータを暗号化および復号化する XNUMX つの方法について説明しました。 そうすることで、データを安全に保ち、不正アクセスから保護することができます。 の パイスパーク、上記のXNUMXつの方法に従い、データを効率的に保護することでこれを達成できます。

この記事の主なポイントは次のとおりです。

  1. データフレームを定義し、「aes_encryption」および「aes_decryption」メソッドを使用してデータを保護しました。
  2. 次に、データを復号化した後の結果を比較して、元のデータが同じであることを確認します。
  3. 次に、暗号化ライブラリを使用してデータを暗号化および復号化します。
  4. ここでは、ユーザー定義関数 (udf) を作成し、この関数を使用してデータ暗号化を実行しました。

この記事は、PySpark で暗号化と復号化を実行するのに役立ちます。 ご意見やご質問がありましたら、下にコメントしてください。 私とつながる LinkedIn さらなる議論のために。

学び続けます!!!

この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。

スポット画像

最新のインテリジェンス

スポット画像