比方說,我有一臺服務器在端口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使用率(近兩全核心)
所以我無法購買加密所有東西的成本是最小的。當然,這是一個數據量非常大的測試。
如果您可以從二進制文件中提取密鑰,您將獲得完全訪問權限 - 對此我可以。據我的理解,ssh對中間人攻擊有抵抗力,至少比一個簡單的系統要求客戶解決服務器發出的挑戰更有效。但我不知道這種額外阻力的性質。 – Fantius 2011-01-13 19:00:44