2011-01-13 40 views
0

比方說,我有一臺服務器在端口1234上偵聽。我有一些客戶端軟件需要能夠連接到此端口。但我想阻止惡意用戶繞過客戶端軟件並通過其他方式(例如在控制檯或其他軟件中)連接到端口。如何以安全的方式驗證客戶端連接?

如果需要,受信任的客戶端軟件和服務器可能共享一個密鑰。我不希望以明文形式發送這樣的密鑰,但認證後的數據可以採用明文形式。具體而言,我試圖找出如何打敗惡意用戶使用可信客戶端軟件來計算服務器挑戰的正確響應的中間人攻擊。

我可以從這裏到達嗎?

我可以讓服務器的偵聽端口只綁定到本地主機,並要求客戶端首先通過ssh獲得對機器的訪問權限。然後,客戶端軟件可以使用ssh庫在連接到本地端口的服務器上運行命令(在這種情況下,惡意用戶將無法使用ssh訪問機器,因爲他沒有密碼)。但後來我的所有流量都被加密了,這是額外的開銷。也許有一個類似於ssh的程序只能進行身份驗證,然後在那之後以純文本的形式離開該通道?

更新:

我跑了測試,以確定與加密所有交通相關的開銷。

spew.rb輸出1000萬個100字符的行。

CONTROL:

[email protected]> time /home/fantius/spew.rb > /dev/null 

real 0m35.015s 
user 0m34.934s 
sys  0m0.084s 

頂部示出了25%的CPU使用率(一個完整的芯,4個內核)

TEST:

[email protected]> time ssh localhost /home/fantius/spew.rb > /dev/null 

real 0m40.704s 
user 0m19.981s 
sys  0m1.400s 

頂部示出了45%的CPU使用率(近兩全核心)

所以我無法購買加密所有東西的成本是最小的。當然,這是一個數據量非常大的測試。

回答

0

你所做的任何事情,以確保鏈接可以/將被顛覆。您可以使用SSL來防止鏈接被嗅探,您可以在應用中嵌入密鑰。但是那些鍵在用戶手中並且可以被提取(不管你多麼努力地隱藏它們)。您最多可以讓惡意用戶模擬/替換/繞過您的遠程應用程序。你永遠無法做到不可能。

SSL開銷很小 - 初次握手的開銷通常比之後實際傳輸數據的開銷要高。如果你保持鏈接打開,握手開銷就變成了一次性的事情,並且長時間的會話無關緊要。如果密鑰重新協商,偶爾會有突發的開銷,但再次,在長期的鏈接上,它是最小的。

至於中間人,你很難做到。銀行已經有足夠的麻煩,因爲木馬使人們的賬戶枯竭。如果有人在中間,他們可以做任何他們想做的事情。有了足夠的監控,他們可以複製整個通信協議並複製您的應用程序。

+0

如果您可以從二進制文件中提取密鑰,您將獲得完全訪問權限 - 對此我可以。據我的理解,ssh對中間人攻擊有抵抗力,至少比一個簡單的系統要求客戶解決服務器發出的挑戰更有效。但我不知道這種額外阻力的性質。 – Fantius 2011-01-13 19:00:44