在没有证书的情况下将基于RSA的加密添加到WCF服务



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

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

我想要真正的安全性,没有硬编码键或其他东西。我正在考虑每次服务器启动时都会生成一个公共/私人按键。这两个键只能存储在RAM中。然后wen客户端连接它应该像SSL一样做。就像这里所述。

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

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

3.客户端上的基础架构(例如,WCF扩展名为行为)在输出之前检查该消息并使用您的共享秘密

对其进行加密。

那是安全的,不是吗?

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


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

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

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

您说您不想使用证书。我不会向您推销证书,但是您缺少的一件事是证书有目的。

证书证明您正在与SSL连接进行谈判的密钥属于您认为其属于的实体。,如果您有某种方法可以确保不使用证书的情况,请务必确保这种情况。,使用RAW键。

问题是,在步骤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的密钥?

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

您有一小部分众所周知的客户集吗?是否可以在客户端上预先配置服务器的公钥?

Alexandru Lungu已创建了一篇有关CodeProject的文章:

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

不,它不会安全!

由于没有机密性,攻击者可以在中间攻击中做男人,所有的安全都消失了。

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

对不起,仅提供安全通信的两种方法是:

  1. 使用包括信任关系链的公共密钥基础架构,又称证书

  1. 使用共享的秘密,又称一个硬编码的密钥。

没有其他解决所有已知的常见攻击向量,例如中间人,重播攻击等。这是艰难的事实。

另一方面,我可以为您提供一种可以减轻您的问题的替代方案:使用兼有

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

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

这样,您的主应用不必处理证书。

最新更新