Вдохновлен разделом 1.3 Дэвид Копек S ” Классические проблемы с информатикой в Python “
Исходный код Для этой статьи о GitHub.
Давайте построим две функции лазурных функций, обе триггеры HTTP. Один, чтобы зашифровать сообщение, другое, чтобы расшифровать его. Справедливое предупреждение о том, что если вы ищете безопасное решение для шифрования, вам лучше подавать в руках людей умнее меня, но я думаю, что есть что -то полезное для работы в работе над этой проблемой.
Как отмечалось выше, логика, используемая в этих примерах, происходит из книги Дэвида Копека. Я работал через это прошлой ночью и хотел взять этот раздел немного дальше. Я переопределял работу в разделе 1.3 «Нерушимое шифрование» в виде двух функций лазурных. Я проведу вас через процесс, чтобы вы тоже могли!
Соберите свои материалы
Прежде чем начать, вам понадобится следующее:
Создать виртуальную среду
Приложение Python Azure Functions требует, чтобы вы работали в виртуальной среде. Если вы не знакомы с использованием Вен
, есть отличный учебник в Настоящий питон Анкет
Bash (macos или linux)
python3.6 -m venv .env source .env/bin/activate
PowerShell или командная строка (Windows)
py -3.6 -m venv .env .\.env\Scripts\activate
Инициализировать приложение для функции Azure
Выполните следующую команду, чтобы создать новое приложение функции:
func init encryption_and_decryption
Теперь есть папка под названием incryption_and_decryption
с кодом шаблона для приложения Python Azure Function. Если хотите, уделите некоторое время, чтобы открыть код в вашем любимом редакторе и осмотреть вокруг.
Если вы ищете редактора, я рекомендую Против кода Анкет
Создать функцию шифрования
Убедитесь, что вы в incryption_and_decryption
каталог:
cd encryption_and_decryption
Создайте новую функцию, используя:
func new
В приглашении выберите HTTP Trigger
. Затем назовите функцию шифровать
Анкет
Шифрование ввода
Откройте файл Encrypt/__ init__.py
. Вы должны увидеть код шаблона для функции триггера HTTP. Эта функция займет имя
как параметр и вернуть “Привет Имя
!”. Давайте добавим код внизу этого файла, который вместо этого будет шифровать имя
Использование случайного набора токеновых байтов.
from secrets import token_bytes def random_key(length: int) -> int: # returns length random bytes key: bytes = token_bytes(length) # convert key to bit string return int.from_bytes(key, "big")
Далее напишите функцию, чтобы использовать этот случайный ключ для шифрования имя
:
from typing import Tuple def encrypt(name: str) -> Tuple[int, int]: # returns (encrypted_name, dummy_key), encrypted by one-time pad # encode the name to bytes, then to a bit string name_as_bytes: bytes = name.encode() name_key: int = int.from_bytes(name_as_bytes, "big") # generate a dummy key for encryption dummy_key: int = random_key(len(name_as_bytes)) # encrypt by XOR operation encrypted_name: int = name_key ^ dummy_key return encrypted_name, dummy_key
Здесь вы закодировали имя к номеру. Это просто еще один способ написания имя
данные. Данные могут быть переведены обратно из этой формы. «Томас», поставить, хотя это преобразование 92807522771315
Анкет Вы можете увидеть это в Python Repl:
>>> name: str = "Thomas" >>> name_as_bytes: bytes = name.encode() >>> name_key = int.from_bytes(name_as_bytes, "big") >>> print(f"name: {name}\nname_as_bytes: {name_as_bytes}\nname_key: {name_key}") name: Thomas name_as_bytes: b'Thomas' name_key: 92807522771315
Я могу преобразовать его обратно:
>>> name_again = name_key.to_bytes((name_key.bit_length() + 7) // 8, "big").decode() >>> print(name_again) Thomas
Вы принимаете int
Представление имени, называемое name_key
и выполнить эксклюзивную или (xor) операцию с random_key int
Анкет В Python xor делается с использованием ^
персонаж. Эта операция создает зашифрованную форму входного имени:
name_key ^ random_key = encrypted_name
Выполнение операции XOR снова с помощью random_key
Отменит шифрование:
encrypted_name ^ random_key = name_key
В некотором смысле, random_key
замки и разблокировки имя
.
Используя шифрование
Теперь, когда у вас есть шифровать
Функция написана, отредактируйте код шаблона, чтобы взять имя
Введите, зашифруйте его и верните зашифрованное имя с помощью ключа. В целом, код в __init__.py
должно понравиться так:
import logging from secrets import token_bytes from typing import Tuple import azure.functions as func def main(req: func.HttpRequest) -> func.HttpResponse: logging.info("func: encrypt: request received") name = req.params.get("name") if not name: try: req_body = req.get_json() except ValueError: pass else: name = req_body.get("name") if name: # encrypt name encrypted_name, dummy_key = encrypt(name) response = str({"encrypted_name": encrypted_name, "dummy_key": dummy_key}) return func.HttpResponse(response) else: # ask for input if none provided return func.HttpResponse( "Please pass a name on the query string or in the request body", status_code=400, ) def random_key(length: int) -> int: # returns length random bytes key: bytes = token_bytes(length) # convert key to bit string return int.from_bytes(key, "big") def encrypt(name: str) -> Tuple[int, int]: # return (encrypted_name, dummy_key); encrypted by one-time pad # encode the name to bytes, then to a bit string name_as_bytes: bytes = name.encode() name_key: int = int.from_bytes(name_as_bytes, "big") # generate a dummy key for encryption dummy_key: int = random_key(len(name_as_bytes)) # encrypt by XOR operation encrypted_name: int = name_key ^ dummy_key return encrypted_name, dummy_key
Тестирование шифровано
Убедитесь, что вы в incryption_and_decryption
каталог и запустите приложение функции с помощью команды:
func host start
Вывод этой команды включает в себя ссылку на конечную точку HTTP для этой функции: http://localhost: 7071/api/incrypt
Анкет
Посещение этого URL -адреса в браузере вызовет функцию Azure, и вы получите ответ «Пожалуйста, передайте имя по строке запроса или в корпусе запроса». Передайте функцию A имя
Параметр путем добавления ? Имя = София
на URL, чтобы он читал:
http://localhost:7071/api/encrypt?name=Sophia
Вы получите ответ, который напоминает JSON с зашифрованным именем и фиктивным ключом:
{ "encrypted_name": 191667540651033, "dummy_key": 278440108655992 }
Попробуйте это с разными именами!
Создать функцию расшифровки
Как и с шифровать
функция, из командной строки, выполнить:
func new
В приглашении выберите HTTP Trigger
. Затем назовите функцию дешифровать
. Вы пройдете оба incrypted_name
а также dummy_key
к этой функции лазурь. Он выполнит операцию XOR, которая отменяет шифрование.
Дешифруя вход
Откройте файл Decrypt/__ init__.py
Анкет Внизу этого файла добавьте функцию в расшифровку
def decrypt(encrypted_name: int, dummy_key: int) -> str: # returns XOR of encrypted_name and dummy_key converted to bytes and decoded name_key: int = encrypted_name ^ dummy_key return name_key.to_bytes((name_key.bit_length() + 7) // 8, "big").decode()
Как показано выше, выполнение операции XOR на incrypted_name
и dummy_key
выведет то же значение, что и name_key
Анкет Затем функция отменяет кодирование из int
к стр
.
Примечание: В Python 3+, //
Оператор делит числитель на знаменатель и возвращает коэффициент как int
, сбрасывая цифры после десятичного десятичного.
например 5//2
Используя расшифровку
Отредактируйте код шаблона, чтобы принять два аргумента incrypted_name
и dummy_key
Анкет Это должно выглядеть так:
import logging import azure.functions as func def main(req: func.HttpRequest) -> func.HttpResponse: logging.info("func: decrypt: request received") encrypted_name = req.params.get("encrypted_name") dummy_key = req.params.get("dummy_key") if not encrypted_name or not dummy_key: try: req_body = req.get_json() except ValueError: pass else: encrypted_name = req_body.get("encrypted_name") dummy_key = req_body.get("dummy_key") if encrypted_name and dummy_key: name = decrypt(int(encrypted_name), int(dummy_key)) return func.HttpResponse(f"Hello {name}!") else: return func.HttpResponse( "Please pass a name on the query string or in the request body", status_code=400, ) def decrypt(encrypted_name: int, dummy_key: int) -> str: # returns XOR of encrypted_name and dummy_key converted to bytes and decoded name_key: int = encrypted_name ^ dummy_key return name_key.to_bytes((name_key.bit_length() + 7) // 8, "big").decode()
Тестирование расшифровки
Запустить приложение Function с Azure с
func host start
Используя выход из шифровать
Функция Azure, проверить Decrypt
Функция при посещении:
http://localhost:7071/api/decrypt?encrypted_name=133673440856088&dummy_key=47262719615353
Это должно вернуть “Привет, София!”.
Попробуйте его со своими собственными зашифрованными значениями, отправив имя в шифровать
конечная точка и замена значений для incrypted_name
а также dummy_key
со значениями, возвращаемыми функцией Azure.
Идти дальше
Функции Python Azure:
- Сообщение в блоге: Более внимательно посмотрите на поддержку Python для функций Azure
- GitHub Repo: Функции Azure Python Worker
Код шифрования и дешифрования происходит от Дэвид Копек S Классические проблемы с информатикой в Python с разрешения автора.
Оригинал: “https://dev.to/teckert/encryption-and-decryption-with-python-azure-functions-4f05”