2013-08-05 81 views
0

我在python中構建了一個認證服務器,並想知道如何完全保證兩個對等方之間的連接?我看不出有什麼惡意用戶無法複製數據包,只要他理解什麼以什麼順序進行分析就可以分析它們。我如何完全確保兩個節點之間的連接?

承認客戶端服務器模式。客戶要求提供賬戶。即使SRP,數據包可以被複制並稍後發送以允許登錄。

那麼現在,如果我添加公私密鑰加密,我該如何向對方發送公鑰而不將它們傳遞到未加密的通道?

對不起,如果我的問題仍然沒有問題,或者看起來我對這個問題並不在意,但我真的很難弄清楚如何在沒有多個安全漏洞的情況下構建身份驗證過程。

+5

可能更傾向於對http://security.stackexchange.com –

+0

有雙方交換的公共密鑰提前定義並輸入給客戶。這是唯一的方法 - 但即使他們被劫持的個人電腦也可能遭到內存劫持等。簡單的回答:你不能。更復雜的答案:防止通過網絡發送敏感信息並讓用戶使用其他方式傳輸信息。 –

+2

以前一直在考慮持續監控的問題:p請參閱[Diffie-Hellman](http://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange)(例如不推薦)。重點是在安全通道上交換密鑰是安全的。 – keyser

回答

2

你在問什麼是通常所說的「密鑰管理」的一部分。如果你谷歌這個詞,你會發現很多有趣的閱讀。您可能會發現您的解決方案需要解決的關鍵管理還有其他方面的問題,比如撤銷和輪換。

在您所關注的密鑰管理的特定部分,您需要弄清楚如何讓兩個節點相互信任。這意味着你必須確定一個你信任的單獨的東西來建立節點的信任。有兩種常見方法:

  1. 信任第三方。這是我們用於我們訪問的大多數網站的模型。當我們的計算機被創建時,受信任的第三方創建設備以便已經瞭解並信任某些實體,如Verisign。當我們通過HTTPS聯繫網站時,瀏覽器會自動檢查Verisign(或其他可信的第三方證書頒發機構)是否同意這是它聲稱的網站。公鑰密碼學的神奇之處在於它是如何工作的,這是一個完全獨立的話題,我建議你調查一下(只是谷歌:))。

  2. 單獨的安全通道。在這個模型中,我們使用一個單獨的頻道,就像一個將密鑰從一個節點轉移到另一個節點的管理員一樣。管理員可以以他/她希望的任何方式執行此操作,例如通過U盤通過sneakernet攜帶的加密數據,或者數據可以通過已經引導的單獨SFTP服務器進行傳輸,並且可以驗證它是否安全(如他/她自己的內部認證機構)。其中一些變化是在名片上共享PGP密鑰(如果您相信給予您名片的人是您想與之通信的人),或通過電話呼叫密鑰所有者並口頭確認您收到的數據的散列與他們發送的數據的散列相同。

有上線的密鑰交換協議 - 你可以看看他們,甚至可能在維基百科上,使用短語「密鑰交換」,但你必須要小心,他們實際上保證你需要的東西確定 - 就像協議如何驗證通信信道的另一端一樣。例如,Diffie Hellman保證你在交換密鑰前不會交換密鑰的實際內容,但你不知道與誰通信 - 這是一個匿名密鑰交換模型。

你還提到你擔心消息重播。現代安全通信協議,如SSH和TLS可以防止這種情況發生。任何優秀的協議都會收到有關其安全屬性的分析,這些屬性在維基百科上經常詳細描述。

哦,你不應該創建自己的協議。關於如何編寫安全協議,分析現有協議和安全特性(或缺少安全特性)有很多內容。除非你打算成爲這個話題的專家(這將需要數年和數千頁的閱讀),你應該採取阻力最小的路徑,只使用一個衆所周知的,行使良好,備受尊敬的協議,你需要的工作。

3

你可以使用某種Transport Layer Security,簡單的TLS/SSL封裝任何網絡套接字。

All the documentation here

簡單的客戶端SSL加密,證明here

import socket, ssl, pprint 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# require a certificate from the server 
ssl_sock = ssl.wrap_socket(s, 
          ca_certs="/etc/ca_certs_file", 
          cert_reqs=ssl.CERT_REQUIRED) 

ssl_sock.connect(('www.verisign.com', 443)) 

print repr(ssl_sock.getpeername()) 
print ssl_sock.cipher() 
print pprint.pformat(ssl_sock.getpeercert()) 

# Set a simple HTTP request -- use httplib in actual code. 
ssl_sock.write("""GET/HTTP/1.0\r 
Host: www.verisign.com\r\n\r\n""") 

# Read a chunk of data. Will not necessarily 
# read all the data returned by the server. 
data = ssl_sock.read() 

# note that closing the SSLSocket will also close the underlying socket 
ssl_sock.close() 

More examples here.

此外,確保使用最新版本的算法來避免密碼不安全因素。

你可能想看看這些問題:

+0

哦,謝謝!在此套接字通道啓用後,可以安全地使用它來發送公鑰?除此之外,選擇有什麼麻煩? – cp151

+1

我猜應該是安全的。但是記住,足夠的安全性是不夠的。總是有人或某事可以隨時破解它。 – enginefree

相關問題