我已经在客户端生成了数字签名(JavaScript)。然后在Java后端上验证签名。为了验证签名,我将传递给后端-(签名值,公钥和用于验证的消息)。到目前为止,一切都很好,但是随后出现了一个问题-如果有人在中间攻击中扮演男人该怎么办?他可以轻松生成签名并发送-(签名值,公共密钥和消息。)。因此,从某种意义上讲,这使我当前的实现不够安全。
如何避免这种情况?据我研究,我必须验证发送的公钥是否来自适当的客户端,并且这是通过CA(证书颁发机构)完成的。但是,就我而言,这是我在大学的最后一个项目,我不确定如何解决此问题。
我应该在客户端生成公钥证书并将其与公钥一起发送吗?是否可以在客户端生成自签名证书,然后在后端进行验证?
答案 0 :(得分:2)
如果有人在中间攻击中扮演男人,该怎么办
MITM可以代替签名和公钥
如何避免这种情况?
主要使用SSL / TLS和/或...
据我研究,我必须验证发送的公钥是否来自适当的客户端,并且这是通过CA(证书颁发机构)完成的
如果使用证书颁发机构,则每个证书都用根CA证书(或subCA)的私钥签名,因此MITM无法创建有效证书,因为他不拥有根私钥。
在服务器端,您可以验证签名是否已使用与CA颁发的证书相对应的私钥执行。请注意,在这种情况下,您将使用证书,而不仅仅是公钥(证书包含公钥)。
我正在大学做最后的项目,我不确定如何解决这个问题。
您已经解释了您的解决方案,但没有解释背景。我的意思是为什么您决定需要数字签名?没有这些信息,我无法建议您。
我应该在客户端生成公钥证书并将其与公钥一起发送吗?
阅读我以前的评论
是否可以在客户端生成自签名证书,然后在后端进行验证?
是的,当然。您可以在客户端生成密钥对,并在注册过程中(使用安全通道)将公钥与用户帐户相关联
这样,您甚至不需要密码。带有私钥的数字签名是身份验证证明。使用CA是可选的。 CA可以颁发包含公钥的证书,但是不需要这种情况