python - 使用 RSA 验证消息的真实性
问题描述
我有来自我的服务器的 JSON 数据,我想在我的客户端上进行验证。我要传输的数据只是一个布尔值,但我已经包含了一个 uuid 作为哈希的一部分。
以下是来自服务器的消息示例:
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")
然后在客户端上,我想一起散列"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")
我的问题是这会打印“否”,并且代码非常混乱。特别是所有的编码和解码以及将字符串转换为字节对象等。
有人可以帮我修复此代码吗?
谢谢。
编辑:
我的代码现在产生“是”。但是,我认为它不是很干净,我想改进它。你有什么建议?
解决方案
推荐阅读
- node.js - `xhr.onload = ()=>{resolve();}` 和 `xhr.onload = resolve();` 之间的区别
- javascript - 通过 JQuery 将内容添加到特定的 HTML 标签
- docker-compose - 使用 DigitalOcean 构建卷
- c# - 使用面板中的控件,仅编辑图片框控件
- python-3.x - 根据对应的列值重复列,根据熊猫数据框中的总值重复行
- python - 计算机开始运行 Python 2.7 版
- javascript - 如何在 Vue js 中使用 arcgis js
- ruby-on-rails - Rails Active::Records 在检测到重复字段时创建不完整的嵌套记录
- javascript - 加载时加载 MP3 或 MP4 音频
- python - 如何在python的嵌套循环中适当地递增