数字签名中间人攻击预防

Digital signature man in the middle attack prevention

我让客户端生成了数字签名(Java脚本)。然后在 Java 后端验证签名。为了验证我传递给后端的签名——(签名值、public 密钥和用于验证的消息)。到目前为止一切顺利,但随后出现了一个问题 - 如果有人在中间攻击中执行人怎么办?他可以轻松生成签名并发送他的 -(签名值,public 密钥和消息。)。所以从某种意义上说,这使得我当前的实现不够安全。

我怎样才能避免这种情况?据我研究,我必须验证发送的 public 密钥是否来自适当的客户端,这是通过 CA(证书颁发机构)完成的。但是,就我而言,我正在做这个作为大学的期末项目,我不确定如何解决这个问题。

我应该在客户端生成 public 密钥证书并将它们与 public 密钥一起发送吗?是否可以在客户端生成自签名证书,然后在后端验证?

What if someone performs a man in the middle attack

MITM 可以替换签名和 public 密钥

How can I avoid this?

主要使用SSL/TLS and/or...

As far as I researched I have to verify that the public key sent is coming from the appropriate client and this is done through CA (Certificate Authority)

如果您使用证书颁发机构,每个证书都使用根 CA 证书(或子 CA)的私钥签名,因此 MITM 无法创建有效证书,因为他不拥有根私钥。

在服务器端,您可以验证是否使用与 CA 颁发的证书相对应的私钥执行了签名。请注意,在这种情况下,您使用的是证书,而不仅仅是 public 密钥(证书包含 public 密钥)。

I am doing this as a final project in university and I am not sure how to approach this problem.

您已经解释了您的解决方案,但没有说明背景。我的意思是您为什么决定需要数字签名?没有这些信息我不能给你建议。

Should I generate the public key certificate on the client side and send them along with the public key?

阅读我之前的评论

Is it possible to generate self-signed-certificates on client-side and then verify it on the back-end?

当然可以。您可以在客户端生成密钥对,并在注册过程中将 public 密钥与用户帐户相关联(使用安全通道)

这样你甚至不需要密码。带有私钥的数字签名是身份验证证明。使用 CA 是可选的。 CA 可以颁发包含 public 密钥的证书,但这种情况不需要