在下最近需要写一个 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/
。谢谢
。