2012-04-30 116 views
2

我有一個應用程序通過Jquery POST和其他應用程序(IPad,Android等)公開Web應用程序使用的服務。我必須建立一個非常安全但仍然足夠快的認證系統。restful WCF服務身份驗證

我想製作一個令牌,它將在登錄時傳遞給應用程序,並且將用於特定時間量(比如說30分鐘)的帖子,它應該自行刷新並且不會過期會話。所以我想讓一個令牌被髮送到服務並且會產生令牌。它將接受

  1. 用戶ID

  2. 密碼(可以使用公共密鑰加密)

  3. 的appid

服務器將通過私鑰解密請求,並生成代幣將在特定時間有效。現在,因爲這將高度依賴於私鑰(這將是相同的,因此係統內的某人可能會泄漏它並濫用它),所以我希望私鑰在特定時間(例如2小時)後刷新。

問題 -

  1. 如何刷新私有密鑰,並確保當前發出的令牌將不會被拒絕。

  2. 是否有這樣做

+0

RE#1,你可以保存舊鍵,直到它正在使用已過期的最後一次會議 - 這意味着關鍵將在最多4個小時左右。 – Jeff

+0

你是什麼意思「現在,因爲這將高度依賴於私鑰(這將是相同的,因此係統內的某人可能會泄漏它並濫用它)」 –

回答

5

的更好的辦法是這樣做的更好的辦法?

是的,它被稱爲SSL/HTTPS。如果您已經在使用HTTPS,那麼就不需要任何這種加密魔法。如果你沒有使用HTTPS,那麼你的設計就已經不夠安全,沒有什麼可以解決這個缺乏重新發明SSL的問題。

那麼應該怎麼做,如果運輸安全(HTTPS)

  1. 客戶端發出的認證以純文本發送用戶名+密碼的請求。
  2. 服務器驗證用戶名和密碼對與該帳戶存儲的(希望)散列密碼對。
  3. 服務器使用靜態AES密鑰以令牌(加密帳戶ID,到期等)響應。
  4. 客戶端將令牌用於所有已認證的請求。

簡單。

有一兩件事你可以做...

爲了防止非安全設備所使用的憑據丟失,你應該從谷歌和其他需要的頁面。不要讓用戶輸入他們的網站密碼,讓他們訪問並登錄到您的Web服務器。從那裏他們點擊'爲設備生成訪問令牌'。生成一個唯一的數據字符串(20個或更多個字符)並將其記錄在其帳戶中。這個'備用密碼'然後可以被用戶從你的網站撤銷。

如何讓這更安全?

你真的不能做的更好,這是爲什麼?

假設攻擊者能夠訪問到你的私鑰。攻擊者可以在竊取用戶名和密碼的同時替換您的服務器或玩中間人。

爲了防止這種情況發生,您可以設法通過一些PKI交換來發送由服務器給予您的公鑰加密的密碼。我作爲一箇中間人可以簡單地給你我自己的公鑰,並訪問用戶名和密碼,然後如果我選擇,將它轉發給真實的服務器。

- 或 -

爲了試圖阻止這種使用將在地方明文密碼來向服務器發送一些鹽+哈希密碼。我作爲一箇中間人可以給你一個固定的鹽值,然後爲這個鹽值預先計算一個完整的彩虹表。現在我再次以清晰的文字顯示每個人的密碼(最多)。

- 或 -

爲了試圖阻止這種使用PKI來建立一些祕密的會話密鑰,然後簽名和加密的每一次溝通。那麼,呃......聽起來很熟悉......見SSL on Wikipedia。要知道,使SSL安全的東西是保護它的私鑰。一旦私鑰丟失,所有的安全和信任都將丟失。

最後說明:

如果不能保護你不能建立安全通信的一些加密密鑰。

您還應該知道,數千個工時已用於SSL的軟件實現(如OpenSSL),並且他們經常在實現中發現漏洞。你自己實現這個目標的希望,並且像IIS或OpenSSL一樣安全,幾乎是NIL。這不是你的Digg,那只是現實,我無法做到,要麼我只知道甚至沒有嘗試。

最後,我的最終建議是關於您的陳述:「系統內的某人可能會泄漏它並濫用它」。這是你真正的問題。解決這個問題,所有其他問題都會容易得多。確保服務器環境應該是您的首要任務。您的第二優先事項應該是儘量減少對客戶的影響,一旦您未能做到第一。

一些有用的鏈接: