青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
在MaNGOS-Zero中認證登錄服務器是已獨立的進程存在的,名字叫realmd,這樣命名可能是和游戲client端根目錄下的realmlist.wtf文件相對應。realmd的主要工作是:檢查登錄用戶的合法性,并在合法的情況下完成通信密鑰的交換,最后把游戲邏輯服務器的地址信息列表傳給client端。

realmd認證的基本流程如下:

圖中的(1)~(7)詳細過程如下:

(1)Client啟動后立即嘗試連接realmlist.wtf文件中指定的認證服務器,就發送LogonChallenge給認證服務器realmd。協議結構如下:

   1: typedef struct AUTH_LOGON_CHALLENGE_C
   2: {
   3:     uint8   cmd;                //Cmd is the command/operation code of the packet. Always 0 for this message
   4:     uint8   error;
   5:     uint16  size;            //Size of the remaining part of the message
   6:     uint8   gamename[4];    //4 byte C-String, containing the String "WoW\0"
   7:     uint8   version1;            //Major version number of the client ( 1 for 1.12.1 )
   8:     uint8   version2;            //Minor version number of the client ( 12 for 1.12.1 )
   9:     uint8   version3;            //Patchlevel version number of the client ( 1 for 1.12.1 )
  10:     uint16  build;            //Build number of the client. ( 5875 for 1.12.1 )
  11:     uint8   platform[4];        //Platform the client is running on, reversed C-String ( "68x\0" for x86 )
  12:     uint8   os[4];            //OS the client is running on, reversed C-String ( "niW\0" for Windows )
  13:     uint8   country[4];        //Locale of the client, reversed C-String ( "SUne" for enUS )
  14:     uint32  timezone_bias;
  15:     uint32  ip;                //IP address of the client in binary format
  16:     uint8   I_len;            //Length of the Identity ( user name ) in characters
  17:     uint8   I[1];                //The Identity string ( user name )
  18: } sAuthLogonChallenge_C;

uint8 I[1]是一個unsigned char的變長數組的頭指針,保存user name,服務器端保存的時候要把\0后面的東西去掉,防止SQL injection。(1.1)執行“SELECT sha_pass_hash,id,locked,last_ip,gmlevel,v,s FROM account WHERE username = '%s'”語句從數據庫中讀取數據。

realmd收到sAuthLogonChallenge_C協議后處理步驟如下:

1) 檢查該ip是否被封禁,如果是發送相應的錯誤

2) 查詢數據庫中是否有該賬戶,如果沒有返回相應的錯誤

3) 查看最后一次登錄ip與賬戶是否綁定,如果綁定對比當前ip與last_ip是否一致

4) 檢查該賬號是否被封禁,如果是發送相應的錯誤信息

5) 獲取用戶名密碼,開始SRP6計算,參見本文最下方的附錄《MaNGOS所使用的SRP6算法》

6) _accountSecurityLevel,保存用戶的權限等級,普通用戶、GM、admin等等

7) 本地化:根據_localizationName的名字找對應的.mpq文件所在的位置比如enUS,zhTW,zhCN

 

(2) realmd向client發送challenge,協議如下:

   1: typedef struct
   2: {
   3:     uint8   cmd;            //Cmd is the command/operation code of the packet. Always 0 for this message.
   4:     uint8   error;
   5:     uint8   unk2;        //random value
   6:     uint8   B[32];        //B is an SRP6 value. It is the server's public value.
   7:     uint8   g_len;        //Length of the SRP6 g value we send the client in bytes. Always 1
   8:     uint8   g[1];            //The SRP6 g value we send the client. Always 7
   9:     uint8   N_len;        //Lenght of the SRP6 N value we send the client. Always 32
  10:     uint8   N[32];        //The SRP6 N value we send the client. 
  11:     uint8   s[32];        //The SRP6 s value
  12:     uint8   unk3[16];        //a randomly generated 16 byte value.
  13:     uint8   unk4;        //a single byte 0.
  14: } sAuthLogonChallenge_S;

 

 

(3)客戶端的Handshaking階段,client為了回應realmd的challenge消息,證明client的密碼和server上保存的密碼一致,需要計算M1值,并發送給realmd,發送的協議如下:

   1: typedef struct AUTH_LOGON_PROOF_C
   2: {
   3:     uint8   cmd;                    //Cmd is the command/operation code of the packet. Always 1 for this message
   4:     uint8   A[32];                //The client SRP6 A value ( public client value ).
   5:     uint8   M1[20];                //The client's SRP6 M value.待比較的最終值
   6:     uint8   crc_hash[20];            //doesn't seem to be used
   7:     uint8   number_of_keys;        //It also seems to be always 0
   8:     uint8   securityFlags;                 // 0x00-0x04
   9: } sAuthLogonProof_C;

計算公式如下,各個變量的含義請查看本文最下方的附錄《MaNGOS所使用的SRP6算法》

A = g^a mod N //a為19個字節的隨機數

B = (kv + g^b) mod N

u = H(A, B)

x = H(s, p)

S = (B - kg^x) ^ (a + ux)

K = H(S)

M = H(H(N) xor H(g), H(I), s, A, B, K)

上訴的哈希函數H都使用的是SHA1

 

(4)realmd收到client發來的Proof協議,(a)開始檢查版本是否允許,(b) 使用SRP6計算M值,與client傳過來的M1做對比,if (!memcmp(M.AsByteArray(), lp.M1, 20)) { } (c) 如果M值相等計算K —— 即sessionkey,并最終保存到數據庫。

 

(5)驗證成功,realmd向client發送server的logon proof

   1: typedef struct AUTH_LOGON_PROOF_S
   2: {
   3:     uint8   cmd;
   4:     uint8   error;
   5:     uint8   M2[20];            //The SRP6 M values,M = H(H(N) xor H(g), H(I), s, A, B, K)
   6:     uint32  unk1;            // AccountFlags (trial 0x08, ProPass 0x800000, gm 0x01)
   7:     uint32  unk2;            // SurveyId
   8:     uint16  unk3;            // some flags (AccountMsgAvailable = 0x01)
   9: } sAuthLogonProof_S;

 

 

(6)_HandleRealmList,查詢realmcharacters表獲得角色和realmid的對應關系,然后可以在RealmList類里通過realmid找到對應的表項,RealmList在初始化的時候再realmlist表里讀取數據放在內存里使用:“SELECT id, name, address, port, icon, realmflags, timezone, allowedSecurityLevel, population, realmbuilds FROM realmlist WHERE (realmflags & 1) = 0 ORDER BY name ” 查詢邏輯服務器。

 

(7)發送realmlist給客戶端,客戶端選擇對應的服務器后點擊enter world的時,會主動斷開和realmd的連接。

 

總結:整個登錄認證過程主要干了如下幾件事

(a)使用公鑰算法驗證client的合法性。

(b)client合法的情況下,計算sessionkey并保存在MySQL里,以備后面的邏輯服務器使用。

(c)驗證通過后,把邏輯服務器列表發給client。

其中最為重要的就是在驗證合法性、交換密鑰的過程中,如何在傳遞的協議里隱藏client的密鑰,使其在被截獲的情況下也無法被黑客解析,這就只能依仗密碼學了。WOW所使用的加密算法是SRP6,詳細的介紹如下:

 

 

 

附錄:MaNGOS所使用的SRP6算法

SRP全稱Secure Remote Password(安全遠程密碼).使用SRP的客戶機和服務器不會在網絡上傳送明文密碼,這樣可以消除直接密碼嗅探行為,另外使用高強度的算法保證了不可能使用字典法攻擊嗅探到的數據[1]。SRP協議的描述見 http://srp.stanford.edu/design.html

SRP6名詞解釋:

N - A large safe prime (N = 2q+1, where q is prime) All arithmetic is done modulo N.

g - A generator modulo N

k - Multiplier parameter (k = H(N, g) in SRP-6a, k = 3 for legacy SRP-6)

s - User's salt

I - Username

p - Cleartext Password

H() - One-way hash function

^ - (Modular) Exponentiation

u - Random scrambling parameter

a,b - Secret ephemeral values

A,B - Public ephemeral values

x - Private key (derived from p and s)

v - Password verifier

對應MaNGOS的計算方法和變量含義:

sha_pass_hash:使用這個函數進行Sha1Hash哈希std::string AccountMgr::CalculateShaPassHash(std::string& name, std::string& password)后得到的值。

N: A large safe prime (N = 2q+1, where q is prime), All arithmetic is done modulo N. 在MaNGOS里N被設成N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");

s: 32個字節的隨機數,算過一次后保存在數據庫里。

x: 計算v值使用到的x,即私鑰是s與數據庫里的sha_pass_hash的倒置的Sha1Hash

v: g^x mod N,驗證密碼時使用Password verifier,算過一次后保存在數據庫里。

g: g = 7

b: 為19個字節的隨機數,每次client連接認證的時候重新生成。

a: 19個字節的隨機數,由客戶端產生。

B: 公鑰, gmod = g^b, N , B = ((v * 3) + gmod) % N

K: 認證通過后最終保存到數據庫里的sessionkey,(1)計算A 客戶端公鑰A = g^a mod N a為19為隨機數,(2)計算x,x = sha(s, I),I = sha(“username : password”); (3)計算u,u = sha(A, B) //(服務公鑰,客戶公鑰);(4)計算S,S = (B - g^x*3)^(a+u*x); (5)計算K,S為32位,K為40位是 sha(s奇部分)20位, sha(s偶部分)20位的奇偶交錯組合。

M: 20個字節的數,用于與client傳過來的最終結果M1進行對比,如果M和M1每個字節都相等則驗證通過。計算方法:t3 = sha(N)[i] ^ sha(g)[i],t4 = sha(username),M = sha(t3,t4,s,A,B,K)

k: k = 3

總結:服務端,客戶端各自計算S的公式個不同,公鑰部分服務端用A,b, 客戶端用B,a 但其計算結果相同………私鑰x被很好的隱藏了,因為想從M獲得x是基本不可能的!基于數學難題基礎上的加密算法確實很給力。

 

References

[1]http://blog.csdn.net/lfhfut/article/details/1124768

[2]http://www.arcemu.org/wiki/

[3]http://hi.baidu.com/zyy503950958/blog/item/3addce90a91eda81a877a463.html

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久av毛片精品| 欧美在线观看一区| 亚洲黄色av| 欧美日韩国产免费| 一区二区高清视频在线观看| 日韩视频中文字幕| 国产精品久久久久久久久免费桃花 | 久久久国产精彩视频美女艺术照福利 | 欧美一级视频精品观看| 国产综合婷婷| 亚洲国产一区二区a毛片| 欧美日韩福利在线观看| 亚洲欧美一区二区三区久久| 欧美在线视频网站| 亚洲精品国产精品乱码不99按摩| 日韩视频在线一区二区三区| 国产精品一区二区三区观看| 麻豆国产精品777777在线| 麻豆91精品91久久久的内涵| 这里只有精品视频| 欧美在线视频一区| 亚洲免费观看视频| 欧美伊人久久久久久久久影院| 最近中文字幕mv在线一区二区三区四区| 亚洲黄色影片| 国产日韩亚洲欧美综合| 在线午夜精品自拍| 欧美日韩精品是欧美日韩精品| 一区二区三区久久精品| 欧美成人精品不卡视频在线观看| 一本大道久久a久久精二百| 午夜一区二区三区不卡视频| 最新日韩中文字幕| 亚洲女人小视频在线观看| 亚洲欧洲日韩综合二区| 午夜伦理片一区| 99国产麻豆精品| 久热精品视频在线观看一区| 欧美一区二区三区在线看| 欧美精品1区2区| 免费在线一区二区| 国产日本欧美一区二区三区| 洋洋av久久久久久久一区| 亚洲精品国产视频| 久久久久青草大香线综合精品| 午夜视频一区二区| 欧美三日本三级三级在线播放| 欧美国产一区在线| 激情成人中文字幕| 欧美一区影院| 欧美亚洲三级| 欧美午夜在线视频| 日韩视频在线观看免费| 亚洲伦理网站| 欧美电影免费观看高清完整版| 裸体一区二区三区| 国产午夜亚洲精品理论片色戒| 亚洲一区二区三区高清 | 欧美亚洲动漫精品| 亚洲免费黄色| 在线一区欧美| 欧美日韩精品一二三区| 亚洲国产综合91精品麻豆| 亚洲成人中文| 美女国产一区| 亚洲电影在线| 日韩视频在线观看| 欧美日本亚洲视频| 亚洲精选在线观看| 亚洲五月婷婷| 国产啪精品视频| 欧美一区二区网站| 久久精品一区二区三区不卡| 国产婷婷色一区二区三区| 午夜综合激情| 鲁大师成人一区二区三区| 亚洲二区三区四区| 蜜臀久久久99精品久久久久久| 欧美激情视频免费观看| 亚洲伦伦在线| 国产精品久久久久久久久久ktv| 亚洲一区二区伦理| 久久久中精品2020中文| 亚洲国产精品一区二区三区| 欧美成在线视频| 99re6热在线精品视频播放速度| 亚洲综合精品四区| 国产一区二区久久| 欧美国内亚洲| 亚洲综合精品一区二区| 久久一日本道色综合久久| 亚洲看片网站| 国产伦精品一区| 另类尿喷潮videofree| 亚洲日本中文字幕区 | 国产精品亚洲网站| 久久综合给合| 中国成人黄色视屏| 另类春色校园亚洲| 中国日韩欧美久久久久久久久| 国产精品影片在线观看| 蜜臀av国产精品久久久久| 一本色道久久| 女人色偷偷aa久久天堂| 亚洲一区在线免费观看| 亚洲夫妻自拍| 国产精品青草综合久久久久99| 久久精品一区二区三区不卡| 日韩午夜剧场| 牛夜精品久久久久久久99黑人| 亚洲一区视频| 亚洲精品久久久久久一区二区| 国产精品人成在线观看免费| 免费黄网站欧美| 欧美一激情一区二区三区| 亚洲精品国产精品久久清纯直播 | 久久综合色影院| 亚洲在线成人| 亚洲精品综合| 亚洲国产经典视频| 国产日韩在线视频| 国产精品久久久久天堂| 欧美日韩国产999| 老司机一区二区三区| 欧美自拍偷拍| 午夜精品福利一区二区三区av| 亚洲丁香婷深爱综合| 另类天堂视频在线观看| 久久国产一二区| 亚洲一区二区在线视频| 一区二区毛片| 妖精成人www高清在线观看| 亚洲国产成人久久综合| 国外成人在线| 国产一区二区成人久久免费影院| 国产精品美女一区二区| 欧美视频三区在线播放| 欧美日韩国产美女| 欧美人与性动交a欧美精品| 欧美国产乱视频| 免费在线观看一区二区| 免费av成人在线| 久久综合一区二区| 蜜臀久久99精品久久久久久9 | 蜜桃伊人久久| 免费成人av资源网| 欧美电影专区| 欧美区亚洲区| 欧美性久久久| 国产精品一二三四| 国产一区二区三区奇米久涩 | 欧美日韩一二三区| 欧美日韩一区二区三区在线| 欧美日韩一区二区免费在线观看| 欧美日韩国产一区二区三区地区 | 欧美在线综合视频| 久久国产欧美| 免费在线成人av| 欧美精品一区二区三区久久久竹菊| 欧美精品一区二区三| 欧美日韩在线看| 国产欧美视频一区二区| 国内一区二区在线视频观看| 亚洲福利视频二区| aaa亚洲精品一二三区| 午夜精品视频网站| 久久夜色精品国产| 亚洲日本电影在线| 亚洲午夜电影网| 久久不射网站| 欧美福利视频| 国产欧美精品| 亚洲国产精品久久久久婷婷老年 | 久久九九久精品国产免费直播| 久久一区亚洲| 亚洲精品国产欧美| 亚洲欧洲av一区二区三区久久| 久久国产直播| 欧美日韩不卡在线| 国内精品视频在线观看| 日韩视频免费观看| 久久精品视频va| 亚洲毛片在线看| 欧美一区二区私人影院日本| 欧美激情欧美狂野欧美精品 | 久久亚洲综合色| 欧美午夜久久久| 在线观看亚洲精品| 亚洲欧美日韩在线不卡| 欧美大片91| 欧美亚洲系列| 欧美性做爰毛片| 亚洲第一福利在线观看| 欧美伊人久久久久久午夜久久久久| 欧美激情一级片一区二区| 亚洲欧美日韩久久精品| 欧美日韩午夜在线视频| 亚洲国产欧美一区| 久久网站热最新地址| 亚洲欧美日韩专区|