Проверка подлинности сообщения с помощью RSA - PullRequest
1 голос
/ 07 января 2020

У меня есть JSON данные, поступающие с моего сервера, которые я хотел бы проверить на своем клиенте. Данные, которые я хочу передать, являются просто логическими значениями, но я включил uuid, чтобы быть частью ha sh.

Вот пример сообщения с сервера:

response = {
    "encrypted": "kgbh6RN2XRHAU1QyjEJXqkr5DmNpnkaS/bdNG7nKoLBCK8V4xzv12ScMii8GJEgpNYbY5oH2gtGBgZxDo3DwkRmzFdomUkDDbpospomTRRCdU7bko8/Ix0MFvm9Dwh6KG3D4AIBW36O9RJ95WsErwox4fwMRR7Qes/anS9dVoVh5nswtyjAjtrDB+dCgTfFbOCqx/cZHpWJWUJ8Rv4Sx/oN+tAOw2ibU4SiLlsF/YYqkesk6spHwB9ud/4kZc8Xfb+QV6t31xZPXwjCgvrySiv/bgGyZl4irPihBAtoD3sM/QEwVpPsUs2zKqALR8rD6LwBUa5gAVrnGU++5kV6RoA==",
    "message_id": "203e4e58-30cf-11ea-8f5b-7085c257599e",
    "valid": False
}

"encrypted" генерируется следующим образом:

import uuid
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.backends import default_backend
import hashlib
from cryptography.hazmat.primitives.asymmetric import padding
import base64


message_id = uuid.uuid1()
with open("public_key.pem", "rb") as key_file:
    public_key = serialization.load_pem_public_key(
        key_file.read(),
        backend=default_backend()
    )
message = bytes(hashlib.sha3_256((str(message_id) + str(valid)).encode("utf-8")).hexdigest(), "utf-8")
encrypted_data = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
encrypted_data = str(base64.b64encode(encrypted_data), "utf-8")

Затем на клиенте я хочу иметь sh вместе "message_id" и "valid", и если сообщение пришло от меня, то результат должно быть таким же, как "encrypted" расшифровано. Итак, я попробовал это:

from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.backends import default_backend
import hashlib
from cryptography.hazmat.primitives.asymmetric import padding
import base64

encrypted = response["encrypted"]
message_id = response["message_id"]
valid = response["valid"]
with open("private_key.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=None,
        backend=default_backend()
    )
encrypted = base64.b64decode(encrypted)
decrypted = private_key.decrypt(
    encrypted,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
new_hash = bytes(hashlib.sha3_256((str(message_id) + str(valid)).encode("utf-8")).hexdigest(), "utf-8")
if new_hash == decrypted:
    print("Yes")
else:
    print("No")

Моя проблема в том, что это печатает «Нет», а код очень грязный. Особенно со всеми кодировками, декодированием и преобразованием строк в байтовые объекты и т. Д. c.

Может кто-нибудь помочь мне исправить этот код, пожалуйста?

Спасибо.

РЕДАКТИРОВАТЬ:

Мой код теперь выдает «Да». Тем не менее, я не думаю, что это очень чисто, и я хотел бы улучшить его. Что бы вы предложили?

...