#python #цифровая_подпись
Всем привет. Помогите разобраться с вопросом. Рассмотрим такой случай, у моей программы есть пользователи и я отправлю файлы, программа у пользователя считывает эти данные. Хочу проверить данные от подмены. Для этого с данными отправляю хэш(в файле) передаваемого файла что бы сравнить. Теперь как защитить этот файл с хэшом? 1. Асимметричное шифрование - для этого мне в программе нужно держать приватный ключ чтобы расшифровать. Тогда могут дикомпелировать программу и узнать приватный ключ, далее публичный и подменять данные. 2. Электронная подпись которая шифрует приватным и расшифровывает публичным, вариант вроде подходящий, но как применить это не ясно, что бы в python проверять хэш. Получилось подписать файл, но для этого я использовал в Window (makecert.exe и signtool.ex) а как это сделать средствами python или может быть есть другой вариант для шифрования закрытым ключом. Спасибо.
Ответы
Ответ 1
Я использовал библиотеку pycryptodome (поскольку pycrypto, похоже, больше не поддерживается). from Crypto.Hash import SHA256 from Crypto.PublicKey import RSA from Crypto.Signature import pkcs1_15 import os fname ="Путь к файлу" # Генерируете новый ключ (или берете ранее сгенерированный) key = RSA.generate(1024, os.urandom) # Получаете хэш файла h = SHA256.new() with open(fname, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): h.update(chunk) # Подписываете хэш signature = pkcs1_15.new(key).sign(h) # Получаете открытый ключ из закрытого pubkey = key.publickey() # Пересылаете пользователю файл, публичный ключ и подпись # На стороне пользователя заново вычисляете хэш файла (опущено) и сверяете подпись pkcs1_15.new(pubkey).verify(h, signature) # Отличающийся хэш не должен проходить проверку pkcs1_15.new(pubkey).verify(SHA256.new(b'test'), signature) # raise ValueError("Invalid signature")Ответ 2
А я использую ctypescrypto. Работать без абстракции классов сложно, но возможности шире. Пока еще не видел проект на питоне, который покрыл бы абстракциями удобными для питона всю OpenSSL. Ctypescrypto выбрал потому, что нигде не смог получить поддержку загрузки плагинов - тоесть поддержку GOST. Вот пример подписи from ctypescrypto.engine import Engine,set_default from ctypescrypto.cms import SignedData,Flags from ctypescrypto.pkey import PKey from ctypescrypto.x509 import X509 set_default(Engine('gost')) req = """data to sign""" with open('/home/eri/Projects/rkn/provider.pem','rb') as f: d = f.read() cert = X509(d) # сертификат с приватным ключем в формате pem в переменной d, загружаю сертификат p = cert.pubkey pk = PKey(privkey=d) # приватный ключ mes = SignedData.create(req, cert, pk, flags=Flags.DETACHED+Flags.BINARY) with open('req.txt.sig','wb') as f: f.write(mes.pem()) with open('req.txt','wb') as f: f.write(req)
Комментариев нет:
Отправить комментарий