3

我正在寻找一种使用 WCF 在客户端和服务器之间加密消息的方法。WCF 提供了许多内置的安全机制来加密客户端和服务器之间的流量,但似乎没有什么符合我的要求。

我不想使用证书,因为它们太复杂了,所以请不要建议我使用证书。我不需要保密,所以我最好使用纯 RSA。

我想要真正的安全性,没有硬编码的密钥或其他东西。我正在考虑在每次服务器启动时生成一个公钥/私钥对。两个密钥都将仅存储在 RAM 中。然后当客户端连接它应该完全像 SSL 一样。就像这里描述的那样。

1.交换某种形式的私钥/公钥对;服务器生成一个密钥对并将私钥保存给自己并与客户端共享公钥(例如,通过 WCF 消息)

2.使用该私钥/公钥对,交换一个共同的共享秘密,例如一个“加密密钥”,它将对称地加密您的消息(并且由于它是对称的,服务器可以使用相同的密钥来解密消息)

3.在您的客户端上设置基础设施(例如,称为行为的 WCF 扩展)以在消息发出之前检查消息并使用您的共享密钥对其进行加密

那将是安全的,不是吗?

是否有任何现有的解决方案来归档我所描述的内容?如果没有,我会自己创建它。我从哪里开始最好?哪种 WCF 自定义行为最好实现?


编辑: 由于这不安全,我将采取以下方法:

安装服务器组件时,将生成新的 X509 证书并自动添加到(服务器的)证书存储区。此生成证书的公共部分将动态包含在客户端设置中。在客户端机器上运行客户端设置时,证书将安装到客户端的 trustet windows 证书存储中。

所以安装产品时没有额外的工作,一切都应该是安全的,就像我们想要的那样。

4

4 回答 4

4

Alexandru Lungu 在 codeproject 上创建了一篇文章:

具有自定义身份验证、授权、加密和压缩的 WCF 客户端服务器应用程序

于 2012-11-01T12:56:19.080 回答
4

你说过你不想使用证书。我不会强迫您使用证书,但是您缺少的一件事是证书是有目的的。

证书证明您正在与之协商 SSL 连接的密钥属于您认为它所属的实体。 如果您有某种方法可以在不使用证书的情况下确保这种情况,请务必使用原始密钥。

问题是,在第 1 步中:

1.exchange some form of a private/public key pair; the server generates a key pair and keeps the private key to itself and shares the public key with the client (e.g. over a WCF message, for instance)

客户端如何知道它从服务器接收到的公钥没有被中间人拦截并被 MITM 的密钥替换?

这就是证书存在的原因。如果您不想使用它们,则必须想出另一种解决此问题的方法。

你有一小群知名的客户吗?是否可以在客户端上预先配置服务器的公钥?

于 2012-11-01T14:11:13.923 回答
2

不,这不安全!

由于没有保密性,攻击者可以进行中间人攻击,并且所有安全性都消失了。

在服务器和客户端之间加密消息的唯一真正安全的方法是实际使用数字证书。

于 2012-11-01T13:25:30.043 回答
1

抱歉,提供安全通信的唯一两种方法是:

  1. 使用包含一系列信任关系(即证书)的公钥基础设施

或者

  1. 使用共享密钥,也就是硬编码密钥。

没有其他方法可以解决所有已知的常见攻击媒介,例如中间人攻击、重放攻击等。这是铁的事实。

另一方面,我可以为您提供一个可以在一定程度上缓解您的问题的替代方案:同时使用.

  1. 编写一个非常非常简单的 Web 服务,它唯一的工作就是生成对称密钥。通过 SSL 发布此服务。需要最终用户凭据身份验证才能获得对称密钥。

  2. 在没有 SSL 的情况下编写其余服务,但使用通过第一个服务发布的对称密钥。

这样您的主应用程序就不必处理证书。

于 2013-10-09T23:32:59.167 回答