我理解如何使用数字签名实现不可否认性和完整性,但这是我尚未掌握的身份验证。
我正在使用C#开发一个Client-Server应用程序,它应该能够使用数字证书和数字签名进行身份验证。我知道如何检查签名的有效性和完整性(使用SignedCms.CheckSignature()),但是如何验证所涉及的任何部分?
例如:
客户端可能是中间人攻击的受害者,并在步骤2中收到有效签名。验证将成功,但客户端不会与正确的服务器通信。
我错过了什么?
答案 0 :(得分:1)
如果中间的人拥有用于签署请求的私钥,他们只能收到有效的签名。我认为你可能缺少的关键是改变数字签名的项目的任何方面都会使签名无效。中间人可以重新提交请求,但如果他们更改了请求,签名验证将失败。
答案 1 :(得分:1)
您缺少对签名证书的信任。
考虑SSL证书,它们具有指向Windows(或任何操作系统)信任的根CA的签名路径。如果MITM提供自签名证书或由不受信任的CA生成的证书,则它将被浏览器拒绝并显示警告。因此,只有在您知道的CA颁发证书或链接到您知道的证书时,证书才会受到信任。
对于自签名证书,它变得更加复杂,您需要安全地交换密钥指纹,序列号或其他常量标识符,并验证签名密钥实际上是您期望的 - 这是自签名证书通常不应该的原因之一用于面向公众的网站或其他服务。
因此,如果存在MITM攻击,并且原始计算机上的签名被剥离,则消息会更改,然后使用未知证书进行重新签名,只要您根据自己信任的内容检查签名证书的身份即可拒绝辞职的消息。
(实际上它变得更复杂,但你得到了我希望的观点)