-
-
[原创]移动客户端与服务器端安全通信方案探讨
-
发表于:
2013-4-27 23:14
2139
-
最近项目中需要解决移动客户端与服务器安全通信的问题,但是不想用第三方安全证书,因为感觉太麻烦,而且需要交钱,而传统的加密又太弱了,所以研究了一下,得出了一个自己的方案,不知道怎么样?安全通信领域咱们看雪论坛久负盛名,大名鼎鼎,高手如云,小弟初入此行,才疏学浅,希望能跟懂行的人多多交流,帮忙斧正一下,小弟不胜感激。如有不妥尽管批评,就事论事追求真理,只是不要牵涉人身攻击就好,感情亲疏也不要影响对事物的认知。小弟主要是做项目开发工作,对于安全方面以前并没有相关经验,因此
希望各路大牛们多从项目角度考虑一下,不只是技术,这个方案到底行不行?有什么问题?有没有可以改进的地方?另外不知道业界对于安全传输方面都是什么个水平?据我了解貌似有些公司安全方面意识很弱,相当不专业。
小弟在此先谢过了。以下是作者的思考:
CS,C客户端,S服务器端
在客户端软件发布前,客户端保存一个公钥,服务器保存一个私钥
C1:客户端随机生成一个对称密钥K,使用公钥加密内容(K+账户+密码)。发送给服务器
S2:服务器收到后使用私钥解密,并验证用户和密码是否正确,正确的话保存此K在用户的信息中(如果原先已经有了K就替换掉旧的),返回数据:包括客户端登录成功的信息,返回一个Token(令牌,以后见牌如见人)和一个uid(用户的id)。
C3:使用本地保存的K解密得到Token和自己的uid。
安全传输准备工作做完了。
C4:每次传输数据对于加密的内容一律使用K进行加密,并附以明文参数uid,然后把此内容发送给服务器。
S5:根据uid找到保存的K,然后进行解密(K仅仅用来解密,对于解密的内容无法验证),查看Token是否匹配,如果匹配的话那么此次请求就是有效的,否则无效。
补充:
网络上的东西总是真真假假无法确定,但是因为客户端软件安装的时候公钥就已经在里面了,因此这个公钥信息是真的,这个规则怎样开始也是确定下来的;
因为公钥私钥是安全的,所以传输的K是安全的,所以使用K对称加密的内容也是安全的,即使黑客破解了少数几个K,对其他的K还是没有影响,而且K具有随机性和时效性,用户注销了或者太久没登录了这个K就会自动失效。
优点:
安全性,除非入侵服务器拿到私钥,或者破解久经考验的非对称加解密算法,没有其他办法大规模攻破,相比其他单纯使用对称加密和非对称加密方法效果都要好。
缺点:
用户第一次握手验证时使用非对称加密的内容,服务器非对称解密消耗资源比较多,如果攻击者发送大量此类信息,容易导致服务器DDoS攻击。个人觉得暂时无法从根本上避免这个问题的发生,只能够加上一些措施增加其难度,从而过滤掉一部分攻击者,具体措施有很多种,比如自己软件写个加密算法,服务器会根据解密算法进行计算从而验证是否有效,再比如android的话把这些算法写在jni层,增加反编译破解的难度,还有其他方法欢迎补充。
性能消耗:
除了第一次登录的时候非对称解密稍微慢一些,其他应该影响不大(尚未做实机测试效果,请勿轻信)
欢迎各路英雄批评斧正!
参考信息:
http://segmentfault.com/q/1010000000156701
http://www.dewen.org/q/2005
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课