移动客户端与服务端的安全交互

项目已更新 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

猜你喜欢

转载自my.oschina.net/fadoudou/blog/1808088