why token 2(参见微信,使用签名)

之前讲了一篇Token的文章,服务器需要每个用户分配一个唯一的Token,并且要在有效期内一直持有和维护。如果分布式的话,还要考虑到Token在服务器之间的共享。
但是有个问题来了,如果token暴露了,那么该用户(甚至平台)就被劫持了。
研究了下微信第三方接入的验证方式,有以下几种情况。
1.公众平台服务器端发起,获取该公众号下用户是上面那个方式,APPSecret+APPid 获取access_token,后面直接通过access_token,全程HTTPS保护无烦恼,秘钥等关键信息不过客户端。
2.开放平台,用户微信登陆,使用的是OAUTH认证并且回调服务器,服务器通过Code+APPSecret+APPid获取该用户基本信息,全程HTTPS保护无烦恼,秘钥等关键信息不过客户端。
3.微信JS-SDK,如果要使用到分享,扫一扫语音等功能,那么就需要微信JS-SDK了。JS-SDK不是随便用的(TMD,腾讯的东西,没钱玩你麻痹),要初始化验证,但是又不能赤裸裸的把APPSecret,access_token放到页面里面初始化(如果这家伙一连电脑调试,就能拿到了,拿了会怎么样? 看情况1,直接把该公众平台下用户数据拉下来随便玩),这也是此种情况不同上两种的原因。

下面讲下针对第三种情况的解决办法,不光光是微信,以后碰到类似场景也可以借鉴。虽然微信不能把access_token返回客户端,但是微信让服务器通过access_token换取一个api_ticket(局部风险保护,以后直接用api_ticket做下面操作),之后服务器使用api_ticket+timestamp+nonce_str 等一些按照字母排序做SHA1算法返回客户端作为签名signature。
之后客户端初始化就用signature到微信平台那验证,过了就OK了,就算signature暴露了,也不会对该公众平台有什么危险。

总结一下就是,如果单纯使用token,必须要保证token的安全(HTTPS)。如果有暴露风险,那么就应该加密/签名。

why token?

最近的一个项目里,客户端与服务器做业务逻辑请求时,都会发生UserID 来识别该用户,并进行相应业务处理。为了防止信息被盗取,加了SSL,后来突然想到一个问题,如果客户端的代码被反编译破解之后,其调用的服务器接口都会暴露出来,包括一些支付的敏感接口。那么这个时候,陌生人就可以直接请求HTTPS接口,因为UserID是相对有规则的,而且是没用防备的,而且可以直接绕开登陆流程。
因此,参考类似于OAUTH协议,应该是首先登陆完成,用户分配一串token,后面的接口都以token为准,这样陌生人直接请求接口也会因为没有合法的token而被拒。token相对于userID最大的特点就是无序,位数长,有失效时间,因此在敏感业务必须用上此机制。
(有人问这个token和一般App Sever的sessionID有什么区别? 其实也没有什么区别(我没有用sessionID- -#,其实是当初大意疏漏了,用了也没这个事了。。。),就是维护一个彼此之间的会话不被第三方陌生人知道。token相比于sessionID 应用环境应该更大一点,系统跨度更广,因为将用户登录授权单独做成了一个模块。

总结:用户验证机制还是要做成一个流程,绕前执行过滤,Mark,否则以后肯定会有坑。

Https 工作原理浅析

最近,碰到个需求:服务器与移动端交互,保护敏感数据。原理之前的HTTP协议,如果自己搞加密,总会有点不安全,所以考虑到了直接用HTTPS。以前知道HTTPS干嘛,但是还没深入研究过,正好可以捣腾下。
如下图
https
1.浏览器与服务器握个手,告知服务器自己支持的加密方式并且拿到服务器CA证书和一个RSA、公钥S_PuKey,然后去校验(CA证书是由一些指定机构颁发的),如果有安全隐患就会提示危险(那么基本就是自己签的,像12306)。
2.接着,浏览器随机生成一个数作为之后交互数据的对称加密秘钥C_Key,把生成的这个数用S_PuKey加密给服务端。这个时候,第三方窃取者可以知道RSA,和S_PuKey,以及密文,但是却无法知道数据内容的明文(因为是非对称的加密方式,而这也是整个加密过程的核心)。服务器用私钥把S_PuKey加密的数据给解开,得到C_Key。
3.最后,服务器和浏览器通信就由这个C_Key对称加密数据。

可能还有双向认证,服务器也要验浏览器这边的证书,方式也差不多,核心也就是RSA阻隔窃取者。
至于自签的HTTPS证书,和机构颁发的HTTPS证书有什么区别,加密功能上看 没有什么区别,自签的照样可以有加密效果。主要是机构颁发的浏览器上可以看到认证的绿色标志,表示不是钓鱼网站,包括IOS item协议下载App的时候也要HTTPS协议(自签要双向认证,你总不可能让别人下个APP还要装个证书吧)