2013-07-10 47 views
1

我需要確保REST請求知道誰在做這件事。我知道HMAC方法,但我不想將客戶機私鑰存儲在我的服務器上。這是我的方法:只分享公鑰是否安全?

  1. 服務器會爲客戶
  2. 服務器發送私有密鑰和客戶端ID給客戶一個私鑰和公鑰
  3. 客戶端存儲的私鑰
  4. SERVER只存儲公鑰客戶端密鑰
  5. 客戶端通過使用其私鑰(ecryptedData)加密其客戶端ID來發出RESTful請求,並將對clientID:encryptedData發送到服務器。SERVER看起來是f或給定客戶端ID的公鑰並解密已加密的數據。SERVER檢查解密後的數據是否包含相同的客戶端ID。如果客戶端ID相同,則SERVER信任發件人,否則拒絕該請求。

也許這種方法已經存在,但我不知道它。

這種方法安全嗎?

編輯

我重新制定了一個問題:

,如果我只關心誰是關於什麼的,他是在單向通信發送發送者,而不是(CLIENT - >服務器),我可以使用RSA以這種方式?

ONE TIME

  1. 服務器創建客戶端的RSA密鑰對
  2. 服務器存儲客戶端的公鑰(如果該鍵爲stolen..it的公共我沒關係!)
  3. 服務器向客戶端發送在客戶端的私鑰對客戶

- >服務器的通信

  1. CLIENT通過其私鑰ex來加密已知單詞+時間戳(以防止重放攻擊)。 SIGNATURE = encrypt(RSA,'FOO:1234234')
  2. CLIENT發送帶有API KEY和singature ex的消息。 54545345:SIGNATURE
  3. 服務器查找給定的API KEY的公鑰
  4. 服務器解密用公鑰信息發現
  5. 服務器檢查已知單詞FOO的正確性和時間戳
  6. 服務器拒絕消息如果上一步失敗

這種方法安全嗎?

非常感謝!
aGO!

+1

錯誤的模式。讓服務器生成自己的私鑰/公鑰(也許是RSA)並共享公鑰。另一方面,要知道誰在呼叫您的REST服務,請嘗試簽名算法(El Gamal?RSA Signature)。 –

+0

爲什麼它是一個錯誤的模式? HMAC方法也將私鑰發送給客戶端 – aGO

+0

假設200客戶端,200個不同的HMAC密鑰生成,並且每個消息需要在服務器信任發件人之前解密。通過El Gamal,服務器只生成其密鑰對,每個客戶端也可以生成它自己的對(如果需要的話)。所以接收者將確定發送者身份檢查消息的簽名(而不是整個消息)。如果你使用POST/GET/PUT動詞,你需要確定這個模式。對於單向通信RSA就足夠了。 –

回答

1

「SERVER發送客戶端私鑰給客戶端」:這看起來不太安全。 如果惡意客戶端攔截此通信,他們可以獲取客戶端的私鑰並可以發送消息,就好像它們是由實際客戶端發送的一樣。 您應該讓客戶端生成兩個密鑰,而不共享私鑰。

+0

好吧,但每個API服務提供商都會將私鑰發送回客戶端(Google,Dropbox,Amazon等)。除此之外,你認爲這個目標足夠安全嗎? – aGO

相關問題