项目已更新 http://my.oschina.net/kaster/blog/167928
----
现有项目的移动客户端与服务端之间进行了加密交互,保证用户隐私数据的安全性。
数据加密使用AES,AES密钥使用RSA加密,每次交互,客户端都传递密文和加密后的密钥。
客户端与服务端之间交互采用http post方式交互,报文格式为xml(也可以用 json,降低报文长度),报文分为包头及包体。
下为请求包头示例:
<?xml version="1.0" encoding="utf-8"?> <message> <head> <version>协议版本</version> <command>命令码</command> <messageId>消息流水号</messageId> <channelId>渠道编号</channelId> <clientId>产品编号</clientId> <clientVersion>产品版本号</clientVersion> <deviceId>设备编号</deviceId> <activeId>激活编号</activeId> <encryptMode>加密模式</encryptMode> <key>加密后的数据加密密钥</key> <digest>加密消息体摘要</digest> <sessionId>会话编号</sessionId> <sessionSign>会话签名</sessionSign> </head> <body>加密消息体</body> </message>
服务端响应消息头:
<?xml version="1.0" encoding="utf-8"?> <message> <head> <messageId>消息序列号</messageId> <result>返回码</result> <resultDesc>返回码描述</resultDesc> <digest>响应消息体摘要</digest> </head> <body>加密消息体</body> </message>
消息包体也为XML格式,不同命令字的包体数据均不同。
------
接口加密方式有以下两种方式:
一:加密模式0:
该模式下,encryptMode值为0,
key为空,
body密文 = Base64(ZIP(包体明文)),
digest摘要=32位MD5(body密文)。
请求和响应都采用该种加密模式。
二:加密模式1:
该模式下,encryptMode值为1,
key为=Base64(RSA(随机AES密钥数据,RSA公钥),
body密文 = Base64(AES(ZIP(包体明文),随机AES _KEY)),
digest摘要 = 32位MD5(body密文)。
明文数据使用PKCS5规则进行补位,加密模式使用AES-ECB。
请求和响应都采用该种加密模式,响应的AES_KEY与请求的一致。
服务端有配置:决定哪些接口可以使用何种加密模式。
------------------
客户端启动后的首次接口交互,是RSA证书更新请求,该接口使用加密模式0进行
请求包体如下:
请求消息体 <?xml version="1.0" encoding="utf-8"?> <body> </body>
响应包体如下:
响应消息体 <?xml version="1.0" encoding="utf-8"?> <body> <rsaVersion>公钥版本号(14位时间字符串)</rsaVersion> <rsaPublicKeyURL>RSA公钥证书文件下载地址</rsaPublicKeyURL> </body>
-------------------
客户端缓存RSA公钥证书版本号和公钥文件,会与接口返回的证书版本号比较,不同时,下载公钥文件,缓存至客户端。
后续接口的访问,都采用加密模式1进行,例如,用户发起登录请求:
请求消息体 <?xml version="1.0" encoding="utf-8"?> <body> <loginName>登录名</loginName> <loginPassword>32位MD5(登录密码)</loginPassword> </body>
响应包体如下:
响应消息体 <?xml version="1.0" encoding="utf-8"?> <body> <result>返回码</result> <resultDesc>返回码描述</resultDesc> <sessionId>会话编号</sessionId> <sessionKey>会话密钥</sessionKey> </body>
------------------
这种交互模式,保证所有客户端传递的信息,只能被拥有私钥的服务端所解析;
服务端返回的数据因为使用请求时的AES_KEY加密,保证返回数据只被发起请求的客户端所解析。
加解密代码参考:http://www.oschina.net/code/snippet_1051910_21338