Криптография на PySpark: PyCryptodome для Apache Spark

безопасность и защита данных в Big Data, шифрование Apache Spark примеры курсы обучение, курсы Apache Spark для разработчиков и дата-инженеров, анализ данных с Apache Spark, аналитика больших данных курсы, криптография в Apache Spark, обучение большим данным для разработчиков и инженеров данных примеры Spark, Школа Больших Данных Учебный Центр Коммерсант

Мы уже писали про использование криптографии в Apache Spark. Сегодня в рамках обучения дата-инженеров и разработчиков распределенных приложений рассмотрим, как шифровать столбцы датафрейма в PySpark и расшифровывать их с использованием алгоритма шифрования AES.

Основы кибербезопасности: ликбез по шифрованию данных

Шифрование данных преобразует данные в другую форму или код, чтобы их могли прочитать только люди, имеющие доступ к секретному ключу (ключом дешифрования) или паролю. В настоящее время шифрование является одним из самых популярных и эффективных методов защиты данных, который активно используется при просмотре веб-сайтов, доступе к документам с цифровой подписью, совершении электронных платежей и пр. Целью шифрования данных является защита конфиденциальности цифровых данных, которые хранятся в информационных системах и передаются по сети.

На смену устаревшему стандарту шифрования данных (DES, Data Encryption Standard) пришли современные алгоритмы шифрования типа RSA (Rivest-Sharmir-Adleman) или AES (Advanced Encryption Standard), которые обеспечивают конфиденциальность и реализуют ключевые меры безопасности, включая аутентификацию, целостность и безотказность. Аутентификация позволяет проверить происхождение сообщения, а целостность обеспечивает доказательство того, что содержимое сообщения не изменилось с момента его отправки. Безотказность гарантирует, что отправитель сообщения не сможет отклонить отправку сообщения.

Данные или открытый текст шифруются с помощью алгоритма шифрования и ключа шифрования. Результатом процесса является зашифрованный текст, который можно просмотреть в исходной форме только в том случае, если он расшифрован с помощью правильного ключа. Выделяют два основных типа шифрования данных: асимметричное (с открытым ключом) и симметричное.

Шифрование с симметричным ключом использует один и тот же секретный ключ для шифрования и дешифрования сообщения или файла. Это намного быстрее, чем асимметричное шифрование, но отправитель должен обменяться ключом шифрования с получателем, чтобы тот смог расшифровать сообщение. Поскольку компаниям необходимо безопасно распределять огромное количество ключей и управлять ими, сегодня чаще используется асимметричный алгоритм для обмена секретным ключом после использования симметричного алгоритма для шифрования данных.

Асимметричная криптография использует два разных ключа: открытый и закрытый. Открытый ключ доступен всем, а закрытый — нет. Это используется в алгоритме RSA, где открытый и закрытый ключи могут шифровать сообщение, чтобы гарантировать конфиденциальность, целостность, подлинность и безотказность данных за счет использования цифровых подписей.

Поскольку в системах хранения и аналитики больших данных часто используются чувствительные данные, их сохранность является важным вопросом. Как реализовать методы шифрования для защиты данных в приложениях Apache Spark с использованием криптографических Python-библиотек для кода на PySpark, рассмотрим далее, а также в отдельной статье.

Криптография для Apache Spark: Python-библиотеки для PySpark

Одной из популярных Python-библиотек, которая реализует криптографические методы защиты данных, является PyCrypto — набор безопасных хэш-функций (SHA256, RIPEMD160) и различных алгоритмов шифрования (AES, DES, RSA, ElGamal и пр.). PyCrypto чем-то похож на JCE (Java Cryptography Extension) для Java. Помимо применения непосредственно для датафреймов PySpark, PyCrypto можно использовать для создания инструментов безопасного администрирования, включая написание системных служб (демонов) и серверов. Клиенты и серверы могут шифровать передаваемые данные и взаимно аутентифицировать себя, а демоны могут шифровать личные данные для дополнительной безопасности. Этот Python-модуль также предоставляет удобную основу для создания прототипов и экспериментов с криптографическими алгоритмами, а благодаря целым числам произвольной длины упрощается реализация алгоритмов с открытым ключом.

Другим Python-пакетом для использования криптографических методов в Apache Spark является PyCryptodome — набор низкоуровневых криптографических примитивов. PyCryptodome не является оберткой для отдельной библиотеки C типа OpenSSL: большинство алгоритмы реализованы на чистом Python, лишь отдельные части, которые чрезвычайно важны для производительности, например, блочные шифры, реализованы как расширения C. Следует избегать одновременной установки PyCrypto и PyCryptodome, поскольку они будут мешать друг другу. Хотя PyCryptodome основан на PyCrypto, он содержит следующие улучшения по сравнению с последней официальной версией PyCrypto 2.6.1:

  • аутентифицированные режимы шифрования (GCM, CCM, EAX, SIV, OCB);
  • ускоренный AES на платформах Intel через AES-NI;
  • улучшенная поддержка PyPy;
  • криптография на эллиптических кривых (P-кривые NIST; Ed25519, Ed448);
  • более компактный API (атрибуты nonce и iv для шифров, автоматическая генерация случайных nonce и IV, упрощенный режим шифрования CTR и пр.);
  • алгоритмы хэширования SHA-3 (FIPS 202) и производные функции (NIST SP-800 185), включая SHAKE128, SHA256 XOF, cSHAKE128, cSHAKE256 XOF, КМАС128, КМАС256, TupleHash128, TupleHash256, KangarooTwelve XOF (производное от Keccak), алгоритмы усеченного хеширования SHA-512/224 и SHA-512/256 (FIPS 180-4), BLAKE2b и BLAKE2s, потоковые шифры Salsa20 и ChaCha20/XChaCha20, Poly1305 MAC, ChaCha20-Poly1305 и XChaCha20-Poly1305 аутентифицированные шифры, функции вывода scrypt, bcrypt и HKDF, а также детерминированные (EC)DSA и EdDSA;
  • защищенные паролем контейнеры ключей PKCS#8;
  • схема обмена секретами Шамира;
  • случайные числа берутся непосредственно из операционной системы, а не из CSPRNG в пользовательском пространстве;
  • упрощенный процесс установки, включая улучшенную поддержку Windows;
  • более чистая генерация ключей RSA и DSA (в основном на основе FIPS 186-4).

Для использования библиотеки PyCryptodome в Spark-приложениях ее следует сперва установить через менеджер пакетов pip:

pip3 install -U PyCryptodome

Дальнейшее использование сводится к разработке криптографических UDF-функций, которые затем регистрируются как UDF и становятся доступными для экземпляра Spark. Для этого следует импортировать библиотеку, заполнить данные и вызвать библиотечные функции для выполнения шифрования. Например, следующий код генерирует новый ключ AES128 и шифрует часть данных в файл, используя режим EAX, который позволяет получателю обнаруживать любую несанкционированную модификацию, как и другие режимы шифрования с проверкой подлинности (GCM, CCM или SIV):

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

data = b'secret data'

secretkey = get_random_bytes(16)
cipher = AES.new(secretkey, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(data)

file_out = open("encrypted.bin", "wb")
[ file_out.write(x) for x in (cipher.nonce, tag, ciphertext) ]
file_out.close()

А создав секретный ключ, можно к приступить шифрованию столбца в датафрейме df, чтобы вместо столбца F показывать шифрованные данные (encrypted_message):

df1 =  df.withColumn(“encrypted_message”, udf_encrypt(secretkey)(F.col(‘message’)))

Расшифровать данные зашифрованного столбца поможет следующий код:

df2 =  df1.withColumn(“decrypted_message”, udf_decrypt(secretkey)(F.col(‘encrypted_message’)))

Освойте администрирование и использование Apache Spark для задач дата-инженерии, разработки распределенных приложений и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://medium.com/codex/encrypting-data-with-spark-big-data-with-pluggable-code-bd70175c98e2
  2. https://www.novixys.com/blog/using-aes-encryption-decryption-python-pycrypto/
  3. https://pycryptodome.readthedocs.io/en/latest/src/features.html
  4. https://pypi.org/project/pycrypto/
Поиск по сайту