近期新增代理商系统,游戏内加入webview以及从浏览器登录系统两种方式。作为服务端开发,与主管讨论之后,不同已有基于netty开发的多个服务器,服务端新增基于Spring-boot开发的服务器提供微服务。本文介绍安全机制设计与实现。
客户端内嵌WebView与服务器通信的加密方案
安全验证采用token做密钥,摘要算法保证内容正确。摘要算法采用最常见的MD5即可。
加密过程是服务端生成token,并把这个token发给客户端,客户端(这里包括WebView内页面)每次请求都附带stime以及token, 对这个字符串做计算形成摘要(sign)。
客户端调用WebView之前,通过protobuffer协议获取token。
此时客户端得到的token格式是:
随机字符串生成规则采用:
客户端第一次拉起WebView,发送格式如下。页面直接将请求参数转发到服务端,服务端拿到完整url,在拦截器中用同样的算法做身份验证:
queryString是未加密之前的请求字符串,stime是客户端当前时间戳,服务端设置请求有效时间为一分钟,防止重放攻击。由于token只在第一次由服务端下发给客户端,后续无传输,所以在不泄露token的前提下,可有效保证客户端提交数据合法。
token发放机制,采用双token隔离安全性:
每次客户端访问时,会重新向服务端请求token,服务端更新token后发送给客户端。
浏览器网页登录与服务器通信的加密方案
浏览器访问的用户认证不采用传统的sessionId,沿袭内嵌WebView与服务器通信的token认证,通过访问路径区分三种安全机制:
用户登录及修改密码采用临时token策略,用户进入页面即获取临时token及uuid,登录请求时携带uuid。服务端验证通过后,将临时token写入到用户正式表中,临时token表删除token。出现到一个问题,就是只有认证成功的用户,临时token才会被删除,其他情况不会被删除,导致临时token表即会越来越大,采用定时任务删除临时表token,即临时token表每天凌晨四点清理一次。涉及到密码相关的传输,密码本身要先加密一次。
用户登录后的安全保障同内嵌WebView与服务器通信的安全机制相同。
发送验证码、初次进入页面、用户确认等无安全威胁的请求,不走安全验证,服务端无需过滤。
举例说明,初次访问页面及登录请求格式如下: