У меня есть 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.
Может кто-нибудь помочь мне исправить этот код, пожалуйста?
Спасибо.
РЕДАКТИРОВАТЬ:
Мой код теперь выдает «Да». Тем не менее, я не думаю, что это очень чисто, и я хотел бы улучшить его. Что бы вы предложили?