在下最近需要写一个c/s软件,以前没有接触过socket,于是就选择了ZeroMQ ,ZeroMQ 不仅是消息列表,还封装了socket,用起来很方便,但是这个东西,我只会收消息和发消息,不知道如何来处理身份验证, 不知道如何让用户登陆,并保持登陆状态,于是我花了一点时间,写了下面的代码。不知道这个能否用在实际应用中,请大家帮忙看看,并给出一些建议
如果你觉得这个代码有哪些地方不合理,请告诉我
--------------------------------------------------------------------------
由于我用的是python,所以,选的是pyzmq 也就是ZeroMQ 的python版本
我先讲下,其中用到的协议:
客户端给服务器发送 connect:give me timestap 可以看到前7个字符串是connect,表示,告诉服务器,我要连接你了,请你发个timestap给我, [timestap用来防止重放攻击]
当服务器收到 客户端的 connect:give me timestap,就生成一个timestap并进行sha256加密,然后发送给客服端 timeStr:877c942ca4ae7238ad8a67ff0b0da1067d3b05f914d26cccfea273964e405111
客户端收消息里有timeStr,就提取出后面的64个timestap字符串,然后把本地的的用户名,密码,和服务器发给客户端的timestap字符串 用冒号 拼接后 一起发送给服务器
givepwd:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3:877c942ca4ae7238ad8a67ff0b0da1067d3b05f914d26cccfea273964e405111
服务器收到givepwd,就对这个消息进行解析,首先判断timestap是否正确,错误就直接断开这个客户端
然后服务器拿数据库里的usernameSalt [username的盐] + 客服端提交的 [用户名sha256加密值] ,得出了一个新的字符串,对这个新的字符串,再次进行sha256加密,然后拿这个和数据库里的usernameSha对比,正确表示用户名对的,错误就断开
密码也是用上面的验证方法
当验证通过,就随时生成一个session并存入数据库 ,然后发给客户端,这里,个人觉得session要入库,因为,如果服务器突然卡死,挂掉,如果重启,那么内存里的数据就会丢失,但恰巧这个时候,某个客户端要提交数据,结果由于服务器里没有session,那数据就会提交失败,影响用户体验;不过转念又想,或许直接存服务器内存里,就算服务器挂了,重启,客户端提交数据,也可以在客户端引导用户重新登陆,但这始终还是没有存数据库好,不知道大家觉得哪个更好
用户每次重新登陆一下,session就会重新生成一下
代码在
http://paste.ubuntu.com/7761757/