多服务器的用户身份认证方案
2009-03-04 11:06
302 查看
原贴:http://blog.codingnow.com/2007/02/user_authenticate.html
当服务器开放给用户直接登陆后,必须面临的一个问题就是用户身份认证的问题。
大多数提供网络服务的公司都做了一套统一的用户认证系统,比如微软的 passport ,网易的通行证,等等。为了避免重复验证用户身份而给用户认证系统带来过大的负担,云风在这里给出一个参考解决方案。
登陆服务器可以只有一台,专门用于用户第一次登陆的身份认证。它认证完用户的身份后,则发放一个游戏系统内部用的临时通行证给用户,用户可以拿着这个临时通行证到指定的地点玩游戏。
我们需要讨论的是,以上流程中的安全问题,以及如何加强安全性。
用户认证过程自然不能传送用户密码的全部信息,这跟密码是否加密无关。简单的安全措施是先由登陆服务器发送一个随机串给用户,用户把这个字符串同自己的密码连接起来,并 md5 以后传回服务器做验证。(这里用 md5 指代一种特定的不可逆 hash 算法)
临时通行证的生成可以是这样:
登陆服务器从数据库中取得用户所属的服务器 id (通常是他最后一次登陆的位置,或者游戏逻辑认为他所在位置)、用户的游戏 id
(往往不同于他的用户名)、一个约定字符串、一个顺序版本号、一些随机字节、把它们连在作一次 des 加密(这里用 des
指代一种特定的可逆密匙加密算法)。每生成一次临时通行证,版本号递增。加密临时通行证的密码由登陆服务器与每个可以接受用户直接连接的服务器约定,永远
不传送给用户。
用户拿到这个临时通行证后,可以用之一次性登陆指定服务器。直到从服务器正常登出,若需切入新服务器,可由老服务器生成下一份临时通行证。临时通行证由于被服务器加密,所以对用户来说是一串无意义字符串,故而无法伪造。
临时通行证传送给用户时,可用用户自己的密码之 md5
值(或者连接一个约定串增加安全性)做密匙加密。这样不知道密匙的人截获数据包也不能获得临时身份证。而临时身份证总是一次有效,且只针对特定服务器(服
务器会检查临时通行证中包含的版本号、服务器 id ),企图用临时身份证多次登陆也会失败。
云风 提交于 February 1, 2007 03:27 PM | 固定链接
怎么我又跟你一样做的。
Posted by:
Viruskiller | (12)
November 3, 2008 12:43 AM
好,放到我的记事本,以便后用
Posted by:
好漂亮 | (11)
January 2, 2008 04:27 PM
用kerberos!!
Posted by:
fangsang | (10)
August 15, 2007 01:55 PM
好文,收藏至20ju.com
Posted by:
草根网 | (9)
August 7, 2007 11:00 AM
我一直使用 gmail 的 email 。在 http://www.codingnow.com 首页就有 :)
至于 bigworld ,前几天我参加了相关项目。不过这个是签署了保密协议的。
这两年我早已脱离相关项目组,而且我对 bigworld 所解决的问题不太感兴趣。
Posted by:
Cloud
| (8)
March 25, 2007 06:03 PM
YunFen,
How can I contact you? Have your company Netease licensed BigWorld and
you have a chance to see that stuff? I'm interested in its scalability.
Thanx.
Posted by:
Mandi Zu | (7)
March 24, 2007 11:04 PM
Hi yun,
Load-balancing portals might be a nice idea, and each portal handles
thousands and thousands of connections, what should you worry about
when a well-tuned network engine can handle 50K+ connections?
Posted by:
Mandi Zu | (6)
March 24, 2007 11:03 PM
个
人觉得还是使用srp6协议更好一些,它应该是当前比较安全的了,可以防止截取通信、猜测、伪装等攻击手段。魔兽世界使用的就是srp6协议,另外魔兽世
界还用session
key对通信包的长度和opcode进行了加密(环形加密,运算量很小),在一定程度上可以防止外挂。不过如果通过dll植入取得session
key,也可以不修改客户端就能写外挂,有关细节就不说了。
Posted by:
mouse | (5)
February 5, 2007 10:57 AM
个
人觉得还是使用srp6协议更好一些,它应该是当前比较安全的了,可以防止截取通信、猜测、伪装等攻击手段。魔兽世界使用的就是srp6协议,另外魔兽世
界还用session
key对通信包的长度和opcode进行了加密(环形加密,运算量很小),在一定程度上可以防止外挂。不过如果通过dll植入取得session
key,也可以不修改客户端就能写外挂,有关细节就不说了。
Posted by:
mouse | (4)
February 5, 2007 10:55 AM
这个容易做集群,所以可以不只一台机器。
Posted by:
Cloud
| (3)
February 2, 2007 01:56 PM
只有一台服务器做登陆生成密钥,会不会存在在瓶颈?
Posted by:
sunway | (2)
February 2, 2007 09:28 AM
多服务 SSO (single sign on) 的标准解决方案是用 kerberos。其它解决方案也是用 kerberos 的模型,值得一看。呵呵。
多服务器的用户身份认证方案
当游戏服务器群达到一定规模后,让用户只从一个入口连入会给这个入口带来很大的压力。这样,我们就需要让服务器群中的多台机器都允许用户直接连接。当服务器开放给用户直接登陆后,必须面临的一个问题就是用户身份认证的问题。
大多数提供网络服务的公司都做了一套统一的用户认证系统,比如微软的 passport ,网易的通行证,等等。为了避免重复验证用户身份而给用户认证系统带来过大的负担,云风在这里给出一个参考解决方案。
登陆服务器可以只有一台,专门用于用户第一次登陆的身份认证。它认证完用户的身份后,则发放一个游戏系统内部用的临时通行证给用户,用户可以拿着这个临时通行证到指定的地点玩游戏。
我们需要讨论的是,以上流程中的安全问题,以及如何加强安全性。
用户认证过程自然不能传送用户密码的全部信息,这跟密码是否加密无关。简单的安全措施是先由登陆服务器发送一个随机串给用户,用户把这个字符串同自己的密码连接起来,并 md5 以后传回服务器做验证。(这里用 md5 指代一种特定的不可逆 hash 算法)
临时通行证的生成可以是这样:
登陆服务器从数据库中取得用户所属的服务器 id (通常是他最后一次登陆的位置,或者游戏逻辑认为他所在位置)、用户的游戏 id
(往往不同于他的用户名)、一个约定字符串、一个顺序版本号、一些随机字节、把它们连在作一次 des 加密(这里用 des
指代一种特定的可逆密匙加密算法)。每生成一次临时通行证,版本号递增。加密临时通行证的密码由登陆服务器与每个可以接受用户直接连接的服务器约定,永远
不传送给用户。
用户拿到这个临时通行证后,可以用之一次性登陆指定服务器。直到从服务器正常登出,若需切入新服务器,可由老服务器生成下一份临时通行证。临时通行证由于被服务器加密,所以对用户来说是一串无意义字符串,故而无法伪造。
临时通行证传送给用户时,可用用户自己的密码之 md5
值(或者连接一个约定串增加安全性)做密匙加密。这样不知道密匙的人截获数据包也不能获得临时身份证。而临时身份证总是一次有效,且只针对特定服务器(服
务器会检查临时通行证中包含的版本号、服务器 id ),企图用临时身份证多次登陆也会失败。
云风 提交于 February 1, 2007 03:27 PM | 固定链接
怎么我又跟你一样做的。
Posted by:
Viruskiller | (12)
November 3, 2008 12:43 AM
好,放到我的记事本,以便后用
Posted by:
好漂亮 | (11)
January 2, 2008 04:27 PM
用kerberos!!
Posted by:
fangsang | (10)
August 15, 2007 01:55 PM
好文,收藏至20ju.com
Posted by:
草根网 | (9)
August 7, 2007 11:00 AM
我一直使用 gmail 的 email 。在 http://www.codingnow.com 首页就有 :)
至于 bigworld ,前几天我参加了相关项目。不过这个是签署了保密协议的。
这两年我早已脱离相关项目组,而且我对 bigworld 所解决的问题不太感兴趣。
Posted by:
Cloud
| (8)
March 25, 2007 06:03 PM
YunFen,
How can I contact you? Have your company Netease licensed BigWorld and
you have a chance to see that stuff? I'm interested in its scalability.
Thanx.
Posted by:
Mandi Zu | (7)
March 24, 2007 11:04 PM
Hi yun,
Load-balancing portals might be a nice idea, and each portal handles
thousands and thousands of connections, what should you worry about
when a well-tuned network engine can handle 50K+ connections?
Posted by:
Mandi Zu | (6)
March 24, 2007 11:03 PM
个
人觉得还是使用srp6协议更好一些,它应该是当前比较安全的了,可以防止截取通信、猜测、伪装等攻击手段。魔兽世界使用的就是srp6协议,另外魔兽世
界还用session
key对通信包的长度和opcode进行了加密(环形加密,运算量很小),在一定程度上可以防止外挂。不过如果通过dll植入取得session
key,也可以不修改客户端就能写外挂,有关细节就不说了。
Posted by:
mouse | (5)
February 5, 2007 10:57 AM
个
人觉得还是使用srp6协议更好一些,它应该是当前比较安全的了,可以防止截取通信、猜测、伪装等攻击手段。魔兽世界使用的就是srp6协议,另外魔兽世
界还用session
key对通信包的长度和opcode进行了加密(环形加密,运算量很小),在一定程度上可以防止外挂。不过如果通过dll植入取得session
key,也可以不修改客户端就能写外挂,有关细节就不说了。
Posted by:
mouse | (4)
February 5, 2007 10:55 AM
这个容易做集群,所以可以不只一台机器。
Posted by:
Cloud
| (3)
February 2, 2007 01:56 PM
只有一台服务器做登陆生成密钥,会不会存在在瓶颈?
Posted by:
sunway | (2)
February 2, 2007 09:28 AM
多服务 SSO (single sign on) 的标准解决方案是用 kerberos。其它解决方案也是用 kerberos 的模型,值得一看。呵呵。
相关文章推荐
- 多服务器的用户身份认证方案
- 多服务器的用户身份认证方案
- 移动 APP 端与服务器端用户身份认证的安全方案
- 移动 APP 端与服务器端用户身份认证的安全方案 \token
- "用户增长"--快速身份认证实现用户增长的技术和产品方案
- 一套.net窗体身份验证方案(解决了防止用户重复登陆,session超时等问题)
- Apache服务器的用户认证 (节选)
- Java https服务器证书认证问题解决方案
- 转:实例学习PHP程序对用户身份认证实现两种方法
- oracle用户身份认证方式
- Apache服务器的用户认证
- 一套.net窗体身份验证方案(解决了防止用户重复登陆,session超时等问题)
- 用户认证管理设计方案
- 基于网络用户的身份认证----学习
- 基于FormsAuthentication的用户、角色身份认证
- 设置Apache服务器之用户认证
- 统一身份认证服务(客户端用户身份验证)
- 蛙蛙推荐:一套.net窗体身份验证方案(解决了防止用户重复登陆,session超时等问题)
- Vsftp服务器搭建--虚拟用户使用MySQL 认证
- 彻底解决SESSION劫持、COOKIE欺骗的用户认证方案