1

我了解如何通过数字签名实现不可否认性和完整性,但这是我尚未掌握的身份验证。

我正在用 C# 开发一个客户端-服务器应用程序,它应该能够使用数字证书和数字签名进行身份验证。我知道如何检查签名的有效性和完整性(使用 SignedCms.CheckSignature()),但这如何验证所涉及的任何部分?

例如:

  1. 客户端向服务器请求数字签名,
  2. 客户端收到签名并验证它,
  3. 如果验证成功,请继续。

客户端可能是中间人攻击的受害者,并在步骤 2 中接收到有效签名。验证会成功,但客户端不会与正确的服务器通信。

我错过了什么?

4

2 回答 2

1

只有中间的人拥有用于签署请求的私钥,他们才能收到有效的签名。我认为您可能缺少的关键是更改经过数字签名的项目的任何方面都会使签名无效。中间的人可以重新提交请求,但如果他们更改它,签名验证将失败。

于 2011-01-12T23:50:05.503 回答
1

您缺少对签名证书的信任。

考虑 SSL 证书,它们具有指向 Windows(或任何操作系统)信任的根 CA 的签名路径。如果 MITM 提供自签名证书或由不受信任的 CA 生成的证书,则会被浏览器拒绝并显示警告。因此,只有当证书由您知道的 CA 颁发或链接到您知道的 CA 时,它才受信任。

对于自签名证书,它变得更加复杂,您需要安全地交换密钥指纹、序列号或其他常量标识符,并验证签名密钥实际上是您所期望的——通常不应使用自签名证书的原因之一面向公众的网站或其他服务。

因此,如果发生 MITM 攻击,并且原始机器的签名被剥离,消息发生更改,然后使用未知证书辞职,只要您根据您信任的东西检查签名证书的身份,那么您将拒绝辞职信息。

(实际上它变得更复杂,但你明白我希望的意思)

于 2011-01-12T23:57:40.877 回答