我有一个连接到php webservice的Silverlight应用程序。我想加密webservice和Silverlight客户端之间的通信。我不依赖SSL。我正在使用AES 256bit Key和IV自己加密/解密POST字符串。
那么重要的问题是:
如何在PHP中生成随机唯一键/ iv对。
如何以安全的方式在Web服务和Silverlight客户端之间共享此密钥/ iv对。
如果没有在客户端上使用某种硬编码密钥或iv,这似乎是不可能的。哪会危及安全。
这是一个公共网站,没有登录。只是安全沟通的要求。
我可以在PHP源代码中硬编码key / iv的种子(使用带有时间戳盐的SHA256进行哈希处理,然后分配为键或iv),这在服务器上是非常安全的。然而,在客户端上,如果是硬编码,则密钥/ iv对的种子将是可见的。
进一步使用时间戳作为唯一性/随机性的基础绝对不行,因为时间戳是可预测的。但它确实提供了C#代码和PHP代码之间的共同因素。
我能想到的唯一另一个选择是让第三个服务涉及为Silverlight客户端提供key / iv,以及php webservice。这当然会重新开始循环,问题是如何在Silverlight客户端上存储用于访问密钥/ iv分发服务的凭据。
然后,解决方案就是非对称加密,因为敏感数据只能在网站的管理后端查看。不幸的是,Silverlight没有非对称加密类。解决方案?滚动我自己的Diffie-Hellman密钥交换!将该密钥插入AES256!
答案 0 :(得分:3)
您的问题的答案是:“SSL”。
对称加密将相对较小的共享秘密(例如,256位密钥)扩展到安全数据传输隧道中,以确保机密性和完整性。这并不像看起来那么容易;有许多小而致命的细节。
非对称加密是指在不安全的网络上建立共享密钥。 RSA加密,Diffie-Hellman ......是可以帮助您的算法。你还是要从某个地方开始;即,如果你使用服务器的公钥(它的RSA公钥,它的一半Diffie-Hellman ......)那么你必须有一些方法知道你正在使用正确的公钥,而不是一些拦截通信的坏人的公钥,而是给你自己的密钥。有办法做到这一点,主要是在客户端应用程序中对公钥进行硬编码,公钥是服务器公钥或可用于签名的密钥(即认证)。当然,使用Silverlight时,客户端代码也会被下载,因此可能会被同一个坏人调整,因此您必须签署代码并让浏览器验证该签名。
所有这些都是艰苦的工作,并且有很多陷阱。 SSL协议经历了所有这些协议,并且耐心但痛苦地更新和修复。这花了很多年,很多聪明的人,牙齿磨得很多。类似的协议是SSH(某些编码细节不同但原理相同)。如果您想设计自己的协议,那么您可能会重演那些困扰SSL和SSH的大多数弱点和问题。只需使用SSL或SSH即可为您节省大量时间和麻烦。
答案 1 :(得分:1)
您可以使用RSA等公钥/私钥加密系统。客户端将使用服务器的公知公钥对数据包进行加密,发送加密数据,服务器将使用秘密私钥对其进行解密。任何人都可以发送使用公钥加密的服务器数据,但只有服务器可以解密它。就像SSL一样。
这让我们回到了这个问题:你为什么不使用SSL?