2012-10-18 70 views
0

我試圖實現具有以下要求的安全系統:服務器端安全協議共享祕密代

  • 所有客戶共享一個密碼,這是服務器已知
  • 每個客戶端都有一個唯一客戶端ID,其中服務器已知
  • 所有知道密碼的客戶端必須能夠在服務器上生成相同的共享密鑰(此祕密ca n爲任何東西,它只是需要對所有客戶端和獨特的跨密碼)相同
  • 密碼需要保持安全,即使服務器或運輸砍死
  • 它必須與另一方是不可能的不同的客戶端ID生成沒有密碼的知識同服務器端祕密

讓我試着給這個圖形表示:)

  Client       Server 
.--------------^-----------.  .----------^----------. 

      f(client-id 1)    g(client-id 1) 
PASSWORD ----------------> request 1 ----------------> KEY 
    || equal            || equal 
PASSWORD ----------------> request 2 ----------------> KEY 
      f(client-id 2)    g(client-id 2) 

這裏,f([G() ]是客戶端[服務器]應用於密碼的功能d [請求]獲取請求[key]。這些功能可能取決於客戶端ID。

有,我想出了可能做到這兩種方法,但我希望的東西簡單,需要較少的流量,減少服務器負載:

  1. 「沒有腦子」:客戶端哈希密碼。客戶端和服務器都使用標準機制(如SSL)來保護其連接並通過此連接發送散列。

  2. 「更聰明一些」:服務器有一個固定的私鑰編碼進去,每個客戶端都有公鑰編碼進去。客戶端對密碼進行哈希處理,將XOR與他們的客戶端ID進行異或,並使用公鑰對RSA/PGP進行加密。然後,服務器使用私鑰對請求進行解密,並將結果與​​客戶端ID進行異或以得到密碼哈希。

在這兩種情況下,服務器的客戶端密碼都是相同的:密碼哈希值。第二個版本的優點是不需要全面的密鑰交換和加密系統的開銷,因爲不幸的是我不能在所有情況下都依靠SSL。事實上,它允許我在沒有任何握手的情況下在單個請求中生成服務器機密。第二個版本中的client-id-XOR用於防止重放攻擊,其中具有不同客戶端ID的第三方可以簡單地將相同的加密消息發送到服務器以生成相同的祕密。基本上,這是一種無需額外添加鹽的方式。

現在的問題:

因爲我真的沒有在服務器端祕密的任何要求,甚至沒有客戶端可以產生這個祕密在當地,有一個更簡單的方式做到這一點這不需要像RSA那樣的任意精度數字的昂貴的模冪運算?我正在考慮爲f()和g()以上的某種其他陷門函數,這可以讓我獲得相同的結果。

回答

0

沒有接受者,我猜...這個問題可能太模糊......

在任何情況下:現在我決定使用RSA(即從上面的方法2)。實施起來很簡單,而且使用正確的庫,運行也不算太貴。