开发过程中遇到了一些数据传输安全性问题,一个很重要实际需求,客户端加密的数据在服务端要解密回来还要进行一些处理。
脑中立马跳出几种解决方法:
1、直接使用MD5进行加密好了,可是MD5是不可逆的算法,而某些数据到达服务器端需要解密出来进行一些处理。看来不满足实际需求。
2、那可以尝试下DES,3DES或者AES等一些对称算法加密处理,想想挺好的,对称算法的效率也挺快。可是密钥该怎么从服务端安全的传递到客户端呢,这个问题不解决,加密还是如同虚设。
3、最后一种方案那就是使用RSA非对称算法,这个算法的好处就是服务器端自己维护私钥,把公钥开放给客户端,有人在网络上监听到公钥和加密后的数
据也没关系,因为加密的数据需要私钥才能解的开。也许大家都熟悉https协议,其实这种协议就是用RSA非对称算法来实现,但是大家肯定也有感受,用
https的时候网页打开的速度会比http要慢很多。我也考虑到这点,于是做了一个基准测试,在服务端写了个测试类,结果让我大吃一惊,2g的cpu循
环100次用私钥去解密竟然花了我50000多毫秒,那我循环10000次呢,靠,竟然花了几分钟。那如果采用这种方案去实现的话,应用程序的性能会被这
些解密动作所拉下。没办法哦,又只能放弃此类方案。
4、山重水复疑无路,柳暗花明又一村。突然脑中又蹦出另外一种想法,还是使用对称算法,关于密钥的传递可以采用DiffieHellman协议。
于是乎,上网查了一些资料,发现java类似的算法还是可以查的到,但是单有java也不行,我要在客户端加密,java端进行解密,所以还需要有
JavaScript的类似算法。最后在enano-1.1.7这个php开源的电子商务网站内找到了相关信息。无意间发现这个开源程序的一篇wiki,
详细介绍了一套安全解决方案(http://enanocms.org/News:Article/2008/02/20/Diffie_Hellman_key_exchange_implemented)。
以上只是我的思路,但还没有写个应用程序测试过。那么光有理论没有实践也不行,那就建个工程实现一下呗。嘿嘿。
case:用户注册。
case描述:客户在客户端填写一些信息,提交之前通过密钥把用户名和密码进行加密,服务端需要把用户名和密码解密回来进行进行处理,一个很重要的
处理就是,给密码加盐值,然后进行MD5加密,也许你会问,为什么这个动作不能在客户端做呢,其实也是可以的,但是为了不想让黑客知道我密码加密的体制所
以放到服务端进行。
case UML:
设计到的一些类和文件:
其中用到了base64,主要就是解决了中文乱码问题。
实现过程中的一些总结:
1、对于安全算法等一些总结,我用到一些相关算法类都是可以单独拿来用的。而jdk中也有支持的相关类,可以看看jca和jce。这两个扩展包其实并没有真正的实现,他们只是对这些安全问题的抽象。真正的实现有sunjce和Bouncy Castle。
2、对于算法本身定义的理解很重要,AES支持128,192,256位的密钥,但每次被加密的一定要是128位的内容,一般我们被加密的都是超过此长度的,那可以这么来处理:
把要加密的内容进行分组处理。解密也是类似。
最后的总结:此次实践只是模拟了一个场景,还可以运用很多场景中,OpenSSL,OpenID都可以运用。不是我说的,我也是看了找了相关的材
料,OpenSSL
java的项目还在建设中,php是有的,大家可以去找下,openid也是有用到的,这里推荐一个开源的项目openid4java,也可以去查查看,
有时间去看看里面的源码还是不错的。如果你也啥地方还不明白或者需要里面用到的一些代码,可以和我沟通交
流,msn:yangpingyu@gmail.com.