我最近试图找到一种在单服务器多客户端系统中保护服务器和客户端之间通信的方法。在密码学领域没有做太多工作,我希望人们能够获得宝贵的意见或反馈,以防我错过了一些重要的东西。
如果重要,将使用.NET Framework 4.0。 现在开始有趣的部分:
客户端建立与服务器的不安全连接(很可能是RESTful调用),要求服务器的公钥(如果未知)和(伪随机)初始化向量。此时,如果之前未知,客户端也将提交他的公钥。
双方都使用Elliptic Curve Diffie-Hellman(基于散列或基于hmac的密钥派生函数,我还不是100%肯定;想法?)来生成密钥(使用System.Security.Cryptography.ECDiffieHellmanCng )
双方计算导出的初始化向量 - 例如通过使用客户端的盐渍密码哈希作为密钥应用keyed hash。
客户端使用对称加密(AES或Rijndael?)恢复与(2)期间生成的密钥和(3)的修改初始化向量的通信,希望使会话安全。
现在我想知道:
答案 0 :(得分:6)
你可以防止中间人如何?
基本上,如何验证为您提供公钥的服务器,是实际的服务器。这是TLS和权限链中的根证书。您是否考虑过仅使用TLS并为服务器购买SSL证书?这可以解决MitM问题,也可能是一个更大的问题:你不需要编写自己的加密包装器,你引入的任何细微错误(甚至是易受攻击的实践)都会成为一种负担。
如果您使用WCF,则开箱即用,它将不信任自签名证书。
有关详细信息,请参阅Best Practices for Security in WCF。
答案 1 :(得分:1)
您所描述的内容非常接近TLS / SSL的工作原理。为什么不用它?