Posted on 2008-07-16 18:08
RichardHe 閱讀(1655)
評(píng)論(29) 編輯 收藏 引用
說(shuō)下最近在忙的事吧.最近公司游戲和一個(gè)社區(qū)合作.我負(fù)責(zé)和這個(gè)社區(qū)平臺(tái)的客戶端和服務(wù)器的設(shè)計(jì)
這個(gè)社區(qū)老是把一些簡(jiǎn)單問(wèn)題復(fù)雜化來(lái)做.本杰我們的和其它平臺(tái)的都已經(jīng)做好了的,但是它們現(xiàn)在想在我的
的客戶端加加一個(gè)內(nèi)嵌瀏覽器.說(shuō)是怕它們的帳號(hào)和密碼被盜,難道放在WEB中輸入就不會(huì)了嗎?不都是在客戶端
輸入嗎?有什么本質(zhì)的區(qū)別嗎?
現(xiàn)在的流程是這樣的,通過(guò)客戶端內(nèi)嵌瀏覽器輸入的用戶名和密碼到它們的服務(wù)器驗(yàn)證,然后把結(jié)果返回到我們
游戲帳號(hào)服務(wù)器,再通過(guò)帳號(hào)服務(wù)器通知我們的客戶端,從而再進(jìn)行登錄以后的事情.
以前我們和XX網(wǎng)的流程,先在客戶端輸入用戶名和密碼,通過(guò)SOCKET到他們的服務(wù)器進(jìn)行驗(yàn)證,通過(guò)以后再登錄到我
們的游戲服務(wù)器,如果這個(gè)用戶名在我們的帳號(hào)服務(wù)器中的話那么進(jìn)行驗(yàn)證登錄,如果不在,則在帳號(hào)服務(wù)器寫入一條
這個(gè)帳號(hào)的記錄,包括用戶名,是否成年等等.
PS:以上的密碼都是經(jīng)過(guò)MD5和一個(gè)密鑰加密的,都是不可逆的,有那么容易破解嗎?
Feedback
如果覺(jué)得自己是對(duì)的 一定要用論證說(shuō)明 有些人是不懂技術(shù)的 只是想當(dāng)然 還是要溝通好 。
我談下自己的想法,是不是那家公司覺(jué)得對(duì)于web訪問(wèn)提供數(shù)字簽名,加密處理等更加方便(例如客戶端安裝控件,服務(wù)端也做對(duì)應(yīng)配置),可能考慮部署更加方便,現(xiàn)成的資源也比較多.
他們的server端是java之類的東西寫的吧。
他們不會(huì)或者懶得寫socket,想直接用servelet而已
@huoxd
應(yīng)該是這樣的!因?yàn)樗麄児緵](méi)有用過(guò)C++開(kāi)發(fā),絕大多數(shù)都是WEB的方式,一直在想辦法通過(guò)WEB來(lái)驗(yàn)證等等!
@cppexplore
我也不知道他們服務(wù)器是什么寫的,應(yīng)該是JAVA,因?yàn)樗麄兊腤EB也是JSP的
人家是怕帳號(hào)密碼在你的客戶端輸入的階段就被HOOK走了,而不是害怕你的數(shù)據(jù)包被破解了。在瀏覽器輸入帳號(hào)密碼絕對(duì)比在你客戶端輸入要安全得多的。他們的要求其實(shí)也是合理的。因?yàn)闉g覽器是相對(duì)安全很多的。但是如果因?yàn)檫@個(gè)問(wèn)題涉及到要修改你系統(tǒng)原先的架構(gòu)那么就不劃算了,如果只是登錄流程變一下,嵌入個(gè)瀏覽器,那還是不過(guò)分的。
@txw
謝謝你的指點(diǎn).如果現(xiàn)在嵌入個(gè)瀏覽器所增加的工作量相對(duì)以前來(lái)說(shuō)是相當(dāng)大的,我這邊的系統(tǒng)和數(shù)據(jù)庫(kù)也要專門重新構(gòu)架了.因?yàn)槟菢拥脑?我還要專門處理它們的服務(wù)器返回到我們的游戲服務(wù)器,再?gòu)奈覀兊挠螒蚍?wù)到游戲客戶端,這之間有一個(gè)映射關(guān)系比較難處理。
是的,如果問(wèn)題涉及到架構(gòu),那或許需要重新溝通。但是如果帳號(hào)密碼安全至關(guān)重要,或許他們的方案更有保障。瀏覽器可以保證輸入的時(shí)候被HOOK的可能性大大減少,同時(shí)數(shù)據(jù)包WEB都是SSL加密的,要破解的可能性也是微乎其微的。還有client是有可能被逆向工程的。
@txw
謝謝了..經(jīng)過(guò)你這么一說(shuō)真是明白了許多..
因?yàn)樽约簺](méi)做過(guò)WEB開(kāi)發(fā)過(guò),所以其中的許多東西還是不太了解的!
根本原因還是因?yàn)槟沁厸](méi)有socket,想直接用servlet吧。這樣他們那邊的改動(dòng)很小,不需要涉入他們不熟悉的領(lǐng)域。被hook,指鍵盤輸入嗎,web下一樣可以。單純的得出結(jié)論:web輸入比client端輸入更安全,這個(gè)論調(diào)還需要詳細(xì)的論證吧,用客戶端的東東多了去了,也都沒(méi)用客戶端嵌入web的方式輸密碼。
https可以用ssl加密隧道,socket一樣可以。
這個(gè)問(wèn)題就是要么你們改,他們不改,要么他們不改,你們用web輸入。
衡量2個(gè)方案的改動(dòng)量,還是你們改比較簡(jiǎn)單。
小小的問(wèn)一下: 直接在客戶端發(fā)送http請(qǐng)求 可以不呢?
我也認(rèn)為 他們只是懶得改 罷了。
不過(guò)反過(guò)來(lái)說(shuō),你現(xiàn)在的情緒是否也有點(diǎn)這樣的成分在里面呢?
不如趁這個(gè)機(jī)會(huì)練下手。等做出來(lái)之后,你就多份經(jīng)驗(yàn)了,WEB的,Socket的你都弄過(guò),那么下次再有類似需求的時(shí)候,你就可以權(quán)衡哪種更好了。
@ 代李
可以
這對(duì)博主來(lái)說(shuō)是個(gè)好方案,還是用socket發(fā)送,可以建立tcp短連接,發(fā)送的數(shù)據(jù)采用http協(xié)議格式的,這樣就兩邊皆大歡喜了吧。
@kun
現(xiàn)在是25號(hào)正式上線,21號(hào)上內(nèi)測(cè),沒(méi)時(shí)間啊?時(shí)間上來(lái)不急.
@cppexplore
用socket發(fā)送,可以建立tcp短連接,發(fā)送的數(shù)據(jù)采用http協(xié)議格式
可以這樣嗎?小弟我也是第一次用網(wǎng)絡(luò)這東西.所以許多東西還是不太懂.
是否可以指點(diǎn)下呢?
@RichardHe
web也是用的socket。http的通訊方式如下:
建立連接(connect)
發(fā)送請(qǐng)求(send)
接收響應(yīng)(recv)
斷開(kāi)連接(close)
每次請(qǐng)求響應(yīng) 都要建立連接,斷開(kāi)連接,就是tcp短連接,也是http使用的方式。
http的格式可以看rfc,或者抓包看看就知道
一般是(post方式才需要body的):
post/get/header url http/1.1\r\n
header: value\r\n
Content-Length: ..\r\n
Content-Type: ..\r\n
\r\n
body
內(nèi)嵌web可以說(shuō)是個(gè)很快速的方案,只要你能拿到web上返回的數(shù)據(jù),又何必自己寫socket發(fā)數(shù)據(jù)呢。或者可以一邊用內(nèi)嵌web寫原型系統(tǒng),一邊寫socket方式的。
@cppexplore
現(xiàn)在問(wèn)題是很難從我的客戶端得到WEB上返回的數(shù)據(jù),要是能得到的話就什么都簡(jiǎn)單了.
可以看看libevent對(duì)http的封裝,類似的庫(kù)也不少。
@RichardHe
我猜也是你拿到返回的數(shù)據(jù)很困難,呵呵。
用socket吧 不需要用apache ace libevent那么復(fù)雜的封裝庫(kù)。寫個(gè)最基本最簡(jiǎn)單的阻塞式socket,連接 發(fā)送 ,等響應(yīng),之后關(guān)閉就是了。發(fā)送就是發(fā)送這個(gè)好了:
POST /url HTTP/1.1\r\n
Content-Length: 24\r\n
Content-Type: application/txt\r\n
\r\n
username=jim&pass=mypass
詳細(xì)的信息可以問(wèn)那邊要,他們一定有示例的頁(yè)面,用頁(yè)面發(fā)個(gè)請(qǐng)求,抓包就知道了。
@CppExplore
謝謝指點(diǎn)......但還是不知道怎么抓包?
用SOCKET抓嗎?也不知道它們返回的是什么樣的消息格式?
它們是有一個(gè)專門的登錄頁(yè)面的.
POST /url HTTP/1.1\r\n
Content-Length: 24\r\n
Content-Type: application/txt\r\n
\r\n
username=jim&pass=mypass
這個(gè)是指什么??我這邊所要發(fā)的嗎?這個(gè)是WEB里面要發(fā)的吧?
Web登陸和客戶端登陸在安全性上沒(méi)有太大差異. 能破解的都能破解. 建議直接提交Web接口數(shù)據(jù),得到返回結(jié)果
@Jezz
我的客戶端很難得到返回的結(jié)果!
直接使用socket發(fā)送 http協(xié)議 返回的東西跟網(wǎng)頁(yè)一樣 只是會(huì)有http頭
1·可以通過(guò)http頭來(lái)判斷是否連接發(fā)送成功
1·可以通過(guò)內(nèi)容來(lái)判斷是否驗(yàn)證成功,比如檢索內(nèi)容里面是否有成功字樣,,等。
@代李
有例子參考下嗎???因?yàn)闆](méi)用過(guò)SOCKET發(fā)送HTTP這樣的
所以不知道怎么做?也不知道怎么用客戶端接收HTTP返回的東東!
謝謝關(guān)注!
@dodo
呵呵..我覺(jué)得應(yīng)該都差不多的...但是就是有些人覺(jué)得瀏覽器比客戶端更安全