1引言 微信是由腾讯公司开发的社交软件,用户可使用该软件发送语音、视频、图片和文字。微信的系统使用平台包括手机、平板、个人电脑等,新版本微信增加了公众平台、朋友圈和消息推送等功能,作为一个大众化的社交软件,微信现在已经拥有了6亿用户,日均活跃用户超过1亿。现阶段微信已经成为中国网络最主流的社交软件,其通信的安全保密性也一直为大家所关注。 本文介绍了微信所使用的通信保密算法和通信流程,其基于RSA加密、随机AES私钥的加密方式设计是通信保密的关键核心,也是目前绝大部分移动终端社交软件的主流加密方式。在现有技术能力下,破解密钥、获取微信通信内容的难度较大。 2微信通信系统所使用的加密算法和通信协议 微信系统所使用的加密算法是现下绝大部分通信软件中较为常用的RSA密钥和AES随机密钥加密算法,其加密方式在现有通信社交软件中属于最高加密等级,破解其加密算法具有极大的难度。 微信通信中用到的几种加密算法。 2.1RSA公钥加密算法 RSA加密算法:目前最有影响力的公钥加密算法,从提出到现在已近二十年,能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。 RSA属于公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种"由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制。 RSA属于非对称算法,公钥加密私钥解密,或者私钥加密公钥解密,公钥和私钥的关系是唯一的,公钥不等于私钥。RSA安全性在于密钥的长度,密钥长度越长,安全系数越高,微信用的1024位的密钥,据说目前计算机速度破解需要2年。 RSA加密算法加密流程。 1)加密端产生明文字符串,获取CER认证公钥。 2)加密机制通过Encoding指定不同的代码页,把字符串转化成不同页码对应的编码,表现为byte[]形式,再将Byte[]字节流明文发送。 3)使用CER证书的公钥对byte[]字节流明文进行加密操作,以byte[]密文形式发送。 相对应解密流程: 1)将公钥转化为PFX证书的私钥,使用PFX证书的私钥对byte[]密文进行解密,还原为byte[]明文字节流。 2)使用加密时Encoding使用的代码页,把byte[]形式的明文转化成是字符串明文并发送。 目前解密技术能力下可行的破解RSA的方法是:替换公钥。就是把流程图中步骤3、4里面的公钥换成自己所掌握的公钥,然后就可以用自己的公钥和私钥去解密,还原出通信的byte[]字节流明文。 2.2AES随机密钥加密算法 AES是一个新的可以用于保护电子数据的加密算法。明确地说,AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(Permutations)和替换(Substitutions)输入数据。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。 微信通信中使用的128位的AES随机密钥,128位AES的加密强度是56位DES加密强度的1021倍还多,假设可以制造一部可以在1秒内破解DES密码的机器,那么使用这台机器破解一个128位AES密码需要大约149亿万年的时间。 AES具体加解密流程如图2所示。 目前的解密技术下,AES只有知道密钥才能解,不知道密钥至今尚没有可行的破解方式。 2.3ProtocolBuffer通信协议 微信通信系统选用ProtocolBuffer作为通信协议。 ProtocolBuffer:是Google的一种数据交换的格式,Google公司内部的混合语言数据标准,目前已经正在使用的有超过48,162种报文格式定义和超过12,183个.proto文件。他们用于RPC系统和持续数据存储系统。 ProtocolBuffers是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的与语言无关、与平台无关、可扩展的序列化结构数据格式。目前提供了C++、Java、Python三种语言的API。 ProtocolBuffer还有一个非常重要的优点就是可以保证同一消息报文新旧版本之间的兼容性。它独立于语言,独立于平台。由于它是一种二进制的格式,比使用xml进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换,作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域,属于开源项目。 3微信通信系统登录验证程序和通信程序 3.1移动端微信通信登录验证流程 移动端微信登录验证(初始化)流程。 1)移动客户端产生一个登录包(包括用户账号、密码、MD5加密信息、随机AES密钥)并使用RSA公钥加密登录包,然后将登录包发送到服务器。 2)服务器接收密文登录包,使用RSA私钥进行解密,获取登录包中的用户账号、密码、MD5加密信息、随机AES密钥等信息。 3)服务器对用户账号密码进行校验,确认用户身份后产生一个验证包,并使用AES密钥加密成验证包密文并发送给客户端。 4)客户端接收验证包密文后,使用AES密钥进行解密,获取验证信息。之后的通信内容均使用AES密钥进行加密通信。 具体流程如图3所示。 |