Всем привет. Помогите разобраться с вопросом. Рассмотрим такой случай, у моей программы есть пользователи и я отправлю файлы, программа у пользователя считывает эти данные. Хочу проверить данные от подмены. Для этого с данными отправляю хэш(в файле) передаваемого файла что бы сравнить. Теперь как защитить этот файл с хэшом? 1. Асимметричное шифрование - для этого мне в программе нужно держать приватный ключ чтобы расшифровать. Тогда могут дикомпелировать программу и узнать приватный ключ, далее публичный и подменять данные. 2. Электронная подпись которая шифрует приватным и расшифровывает публичным, вариант вроде подходящий, но как применить это не ясно, что бы в python проверять хэш. Получилось подписать файл, но для этого я использовал в Window (makecert.exe и signtool.ex) а как это сделать средствами python или может быть есть другой вариант для шифрования закрытым ключом. Спасибо.
Ответ
Я использовал библиотеку 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")
Комментариев нет:
Отправить комментарий