我正在寻找一种使用WCF加密客户端和服务器之间的消息的方法。 WCF提供了许多内置的安全机制来增强客户端和服务器之间的流量,但似乎没有任何东西符合我的要求。
我不想使用证书因为它们太复杂了所以请不要建议我使用证书。我不需要保密,所以尽管使用普通的RSA我会做得最好。
我想要真正的安全性,没有硬编码的密钥或其他东西。我在考虑每次服务器启动时都会生成一个公钥/私钥对。两个密钥只存储在RAM中。 然后,如果客户端连接它应该完全像SSL。正如here所述。
1.交换某种形式的私钥/公钥对;服务器生成密钥对并将私钥保留给自己并与客户端共享公钥(例如,通过WCF消息)
2.使用该私钥/公钥对,交换共同的共享密钥,例如一个“加密密钥”,它将对称加密你的消息(因为它是对称的,服务器可以使用相同的密钥来解密消息)
3.客户端上的设置基础结构(例如,称为行为的WCF扩展)在消息出来之前检查消息并使用您的共享密钥对其进行加密
那会安全,不是吗?
是否有任何现有解决方案可以归档我所描述的内容?如果没有,我会自己创建它。我哪里开始最好?哪种WCF自定义行为最好实现?
修改 由于这不安全,我将采取以下方法:
安装服务器组件时,将生成一个新的X509证书,并自动添加到(服务器的)证书库中。此生成的证书的公共部分将动态包含在客户端设置中。在客户端计算机上运行客户端安装程序时,证书将安装到客户端的trustet windows证书库中。
因此,在安装产品时没有额外的工作,一切都应该是安全的,就像我们想要的那样。
答案 0 :(得分:4)
Alexandru Lungu创建了一篇关于codeproject的文章:
WCF Client Server Application with Custom Authentication, Authorization, Encryption and Compression
答案 1 :(得分: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的密钥取代?
这就是证书存在的原因。如果你不想使用它们,你必须想出另一种解决这个问题的方法。
您是否拥有一小组知名客户?是否可以在客户端上预配置服务器的公钥?
答案 2 :(得分:2)
在服务器和客户端 IS 之间加密邮件以实际使用数字证书的唯一真正安全方式。
答案 3 :(得分:1)
对不起,提供安全通信的唯一两种方法是:
或
没有其他任何东西可以解决所有已知的常见攻击媒介,例如中间人,重播攻击等。这是一个很难的事实。
另一方面,我可以为您提供一种可以缓解您的问题的替代方案:使用两者。
编写一个非常非常简单的Web服务,其唯一的工作就是生成对称密钥。通过SSL发布此服务。需要最终用户凭据身份验证才能获得对称密钥。
在没有SSL的情况下编写其余服务,但使用通过第一个服务发布的对称密钥。
这样您的主应用程序就不必处理证书。