问题
这两天一直在想公司app的安全问题,因为发现很多app登录的时候其实是裸奔的,带着账号和密码,等塞进post 请求参数里,直接飞向了服务器。这本都是敏感信息,不应该这样轻易暴露在外边。以前所在公司,也吃过这种亏。之前也一直看过加密的问题,但是也没有深入的理解,那天趁着细明哥在,问了问他,所以稍微记录下使用的流程。以后真的用到这个过程时候,掉坑了再回头填。
过程
1、客户端将 username 和 pwd 做md5 处理,然后再加上客户端的AES key,将这部分内容通过RSA加密,传给服务器。
2、服务器会通过一个私匙,解开登录传过来的数据,获得 username、pwd,和 客户端的AES key。
3、登录成功后,服务器也回生成服务器端的AES key,然后将登录成功的状态 和服务器端生成的AES key,通过客户端的AES key进行加密,回传给客户端,完成这次登录的请求。
4、客户端收到登录回调的数据,通过客户端自己的AES key 将数据解开,获得登录的状态和服务器端的AES key。获取了服务器端的AES key 之后,自己本地生成的AES key丢弃,并保存服务器端的AES key。
5、以后需要加密的信息就直接通过服务器端的 AES key 加密,传给服务器。
6、服务器可以动态控制AES key,这样伪造请求被发现后,也可以更换服务器的AES key。
流程图
一些Tips
1、RSA只在登录的时候使用。为什么只在登录时候使用,因为RSA加密有一些限制,首先他的密文长度只有117个字节,如果你需要加密的内容过长,那么可定会超过117,这样就超出了限制,无法完成进一步的处理。其次,RAS加密是需要时间的啊,骚年!普通内容,每次使用RAS加密,效率肯定不高啊。
2、在解编码过程中,涉及到了base64,记住base64 超过一定长度会自动换行,拿到的base64 编码,记得去掉换行符,不然是解不出来的。
3、用服务器的AES key原因就是可以动态的改变,如果一直使用客户端的AES key,一旦泄露之后,如果要修改密匙就只能APP升级了。
总结
只是了解了一些基本过程,其中还有很多坑,等哪天真的使用上了,在来填坑吧。如果有错误的地方,欢迎拍砖。
参考
1、wiki上的 AES 、RSA
2、RSA算法原理(阮一峰)