多服务器游戏单点登陆设计思路

来源:互联网 发布:大数据采集工具 编辑:程序博客网 时间:2024/05/01 09:22

多服务器游戏单点登陆设计思路

 

大型棋牌类游戏往往集成多个游戏,像联众边锋等,就有中国象棋、国际象棋、围棋、军旗等几十种游戏,而每种游戏又有多个游戏服务器,比如网通服务器、电信服务器等。这个多的游戏服务器不可能每个服务器都含有登陆功能,不然的话就有使系统功能重复,增加开发的工作量,而且最主要的是使得数据同步变得极为困难,甚至是根本不可行。 因此使用一个或多个专门的登陆服务器进行登陆验证时非常有必要的。

登陆服务器

游戏服务器A

游戏服务器B

游戏服务器C

如上图,是一个单登陆服务器,多个游戏服务器的简单模型。实现单点登陆的难点在于怎么样来确定登陆服务器和游戏服务器的ID为同一个角色。我们以TCP为例,当一个玩家进入登陆服务器之后,他就会跟登陆服务器建立一个连接,比如说连接的socket id ID1,这时候这个玩家进入了游戏服务器A,他又会跟游戏服务器A建立一个连接,假设连接的socket id ID2,我们怎么样才能知道这个ID2跟登陆服务器中的ID1为同一个人呢?因为只有知道了是同一个人,我们才能把所有针对ID2的操作告诉ID1,比如可能要把ID2在游戏中的输赢情况告诉ID1,或者我们也需要把ID1的一些变化告诉ID2,比如ID1登陆了,或者ID1注销了,这些消息我们都是需要通知游戏服务器中的ID2的。

 

要做到ID1ID2 互相认识,有一个做法就是给ID1ID2传送一份相同的字符串,我们把它叫做数字签名,比如使用用户名作数字签名。这当中的操作顺序是:我们首先会连接登陆服务器,这样就产生了ID1,当我们连接游戏服务器的时候,然后就产生了ID2,这时候让游戏服务器主动和登陆服务器联系,让它们之间协作在ID1ID2之间建立联系。

 

当然,如果仅仅使用用户名作数字签名是很不安全的,因为用户名毕竟不会太长,很容易被猜出。所以有人会使用用户名和密码一起做数字签名,但是这样也会产生一个问题,那就是每连接一次游戏服务器,都需要传送用户名和密码,可能会造成用户名密码泄露。所以更好的解决办法是产生一个随机的字符串(当然两个更好,为了简单起见,我们举例的时候就用一个好了),这个顺序是这样的

玩家程序启动〉产生数字签名〉连接登陆服务器〉产生ID1—〉告诉ID1数字签名

玩家连接游戏服务器〉产生ID2—〉告诉ID2数字签名

游戏服务器跟登陆服务器联系ID2ID1互相认识

 

这种方法可以解决用户名密码的安全问题,但是无法保证数字签名的唯一性。所以最好的做法是由登陆服务器产生这个数字签名,以避免出现重复的数字签名,步骤如下面:

 

玩家程序启动〉连接登陆服务器〉产生ID1—〉产生数字签名——〉告诉玩家数字签名

玩家连接游戏服务器〉产生ID2—〉告诉ID2数字签名

游戏服务器跟登陆服务器联系ID2ID1互相认识。

 

 

当然,一个真正的系统是不可能传送明文的,所以传送的信息必须经过加密处理。为了满足加解密速度和兼顾保密性的,一般可以采用DES方式对信息进行加密和解密,而DES的密钥可以通过RSA方式得到。这样的话,上面的过程就是这样:

 

玩家程序启动〉连接登陆服务器〉登陆服务器上面产生ID1—〉玩家程序生成一对RAS的私钥和公钥〉玩家程序告诉登陆服务器公钥à登陆服务器生成DES密钥à登陆服务器使用公钥加密DES密钥并把密文传送给玩家程序〉玩家程序用私钥解开密文,得到DES密钥〉登陆服务器产生数字签名——〉登陆服务器用DES密钥加密数字签名并把密文告诉玩家程序〉玩家程序用DES密钥解开得到数字签名

 

玩家连接游戏服务器〉玩家程序生成一对RAS的私钥和公钥〉玩家程序告诉游戏服务器公钥à游戏服务器生成DES密钥à游戏服务器使用公钥加密DES密钥并把密文传送给玩家程序〉玩家程序用私钥解开密文,得到DES密钥〉游戏服务器上面产生ID2—〉玩家程序使用DES密钥加密数字签名并传送给ID2

 

游戏服务器跟登陆服务器联系ID2ID1互相认识。(其中也有DES密钥产生过程,不再赘述)

 

原创粉丝点击