Python предоставляет различные встроенные алгоритмы для криптографических задач. Эта статья продемонстрируетhmac.Встроенные алгоритмы для задач шифрованияодин**,для использования PythonПодписание и проверка зашифрованных сообщений** и запуск в графическом интерфейсе Python через Python4Delphi для получения результатов.
hmacМодуль реализует связывание для проверки сообщений, как описано в RFC 2104. Алгоритм HMAC можно использовать для проверки целостности информации, передаваемой между приложениями или хранящейся в потенциально опасном месте.
Основная идея заключается в создании криптографического хэша реальных данных в сочетании с общим секретным ключом. Полученное хеш-значение затем можно использовать для проверки переданной или сохраненной информации для определения уровня доверия без необходимости передачи секретного ключа.
Эта статья поможет вам
Как реализовать криптографические службы Python с помощью встроенной библиотеки hmac в приложении Windows с графическим интерфейсом?
предпосылкиПрежде чем мы начнем работать, пожалуйста, скачайте и установите последнюю версию для вашей платформы.Python. в соответствии сздесьУпомянулPython4DelphiПримечания по установке. Кроме того, вы также можете ознакомиться с простыми инструкциями в этом видео.Начало работы с Python4Delphi.
Сначала откройте и запустите наш графический интерфейс Python, используя Python4Delphi и проект RAD Studio Demo1. Затем вставить скрипт в нижний мемо, нажать кнопку выполнить и получить результат в верхнем мемо. ты сможешьGitHubНайдите исходный код Demo1 на . Закулисные подробности о том, как Delphi запускает ваш код Python в этом удивительном графическом интерфейсе Python, можно найти здесь.Ссылка на сайтнайти в.
Откройте Demo01.dproj
Как мы можем использовать бинарные дайджесты для создания дайджестов для печати?
давайте попробуем одинбинарный дайджестпример для создания сводки для печати. Некоторые веб-сервисы (Google Checkout, Amazon S3) используют двоичные дайджесты в кодировке base64 вместо шестнадцатеричного дайджеста. Запустите следующий код в графическом интерфейсе Python4Delphi.
import base64
import hmac
import hashlib
with open('lorem.txt', 'rb') as f:
body = f.read()
hash = hmac.new(
b'secret-shared-key-goes-here',
body,
hashlib.sha1,
)
digest = hash.digest()
print(base64.encodebytes(digest))
Строка в кодировке base64 заканчивается на новой строке, и ее часто необходимо удалить при встраивании строки в заголовок http или другую среду, чувствительную к формату. Давайте посмотрим на вывод в графическом интерфейсе Python.
Как реализовать приложение для подписи сообщений в Python?
Далее, давайте попробуем более сложный примерПриложения для подписи сообщений. Аутентификацию HMAC следует использовать для любой общедоступной сетевой службы и в любое время, когда данные хранятся, когда важна безопасность. Например, при отправке данных по каналу или сокету данные должны быть подписаны, а затем подпись проверяется перед использованием данных.
Ниже приведена реализацияприложение для подписи сообщенийШаг:
- Создайте функцию для вычисления дайджеста строки и создайте простой класс для создания экземпляра и передачи по каналу связи.
- Создайте буфер BytesIO для представления сокета или канала. В этом примере используется наивный, но легко анализируемый формат потока данных. Записывается сводка и длина данных, за которыми следует новая строка. Далее идет сериализованное представление объекта, созданного pickle.
- Для этого примера программы запишите в поток два объекта. Первый объект записывается с правильным значением дайджеста. Второй объект записывается в поток с недопустимым дайджестом, вычисленным на основе каких-то других данных, а не обработанных данных.
- Теперь, когда данные находятся в буфере BytesIO, их можно снова считать. Сначала прочитайте строку с дайджестом и длиной данных. Затем прочитайте остальные данные, используя значение длины. pickle.load() может читать непосредственно из потока, но это предполагает доверенный поток, которому недостаточно доверяют, чтобы распаковать его. Безопаснее читать pickle как строку из потока без фактической распаковки объекта.
- Как только извлеченные данные находятся в памяти, значение дайджеста можно пересчитать и сравнить с прочитанными данными с помощью compare_digest(). Если дайджесты совпадают, можно доверять данным и распаковывать их.
import hashlib
import hmac
import io
import pickle
import pprint
def make_digest(message):
"Return a digest for the message."
hash = hmac.new(
b'secret-shared-key-goes-here',
message,
hashlib.sha1,
)
return hash.hexdigest().encode('utf-8')
class SimpleObject:
"""Demonstrate checking digests before unpickling.
"""
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
# Simulate a writable socket or pipe with a buffer
out_s = io.BytesIO()
# Write a valid object to the stream:
# digestnlengthnpickle
o = SimpleObject('digest matches')
pickled_data = pickle.dumps(o)
digest = make_digest(pickled_data)
header = b'%s %dn' % (digest, len(pickled_data))
print('WRITING: {}'.format(header))
out_s.write(header)
out_s.write(pickled_data)
# Write an invalid object to the stream
o = SimpleObject('digest does not match')
pickled_data = pickle.dumps(o)
digest = make_digest(b'not the pickled data at all')
header = b'%s %dn' % (digest, len(pickled_data))
print('nWRITING: {}'.format(header))
out_s.write(header)
out_s.write(pickled_data)
out_s.flush()
# Simulate a readable socket or pipe with a buffer
in_s = io.BytesIO(out_s.getvalue())
# Read the data
while True:
first_line = in_s.readline()
if not first_line:
break
incoming_digest, incoming_length = first_line.split(b' ')
incoming_length = int(incoming_length.decode('utf-8'))
print('nREAD:', incoming_digest, incoming_length)
incoming_pickled_data = in_s.read(incoming_length)
actual_digest = make_digest(incoming_pickled_data)
print('ACTUAL:', actual_digest)
if hmac.compare_digest(actual_digest, incoming_digest):
obj = pickle.loads(incoming_pickled_data)
print('OK:', obj)
else:
print('WARNING: Data corruption')
- Вывод показывает, что первый объект проверен, а второй объект считается «сломанным», как и ожидалось.
Сравнение двух дайджестов с простыми строками или байтами можно использовать в атаках по времени, раскрывая часть или весь ключ путем передачи дайджестов разной длины. compare_digest() реализует быструю, но постоянную функцию сравнения времени для предотвращения атак по времени.
Поздравляем! Вы узнали, как реализовать шифры Python. Вы узнали, как использовать встроенный графический интерфейс Python для приложения Delphi для Windows.hmacБиблиотеки для реализации криптографических сервисов Python.