Мы уже писали про использование криптографии в 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 в Москве:
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark
- Машинное обучение в Apache Spark
- Графовые алгоритмы в Apache Spark