2013-03-14 77 views
0

我有一點點的GAE應用,爲我的Android應用程序在後臺運行。 我在應用程序中有一個servlet,用於從數據存儲中提取數據並將其發送給用戶。 我不希望任何人能夠使用這個servlet,所以我在應用中存儲了一個私鑰,並且爲每個發送令牌的請求 - 私鑰的哈希字符串和當前毫秒數,以及毫秒我在散列中使用。 服務器正在使用毫秒和私鑰,並將其與令牌進行比較。如果進展順利,服務器將存儲毫秒數爲HashSet,以便它不會再使用它。 (有人可以嗅探設備數據 - 並一次又一次地發送相同的毫秒和令牌)。App Engine中的servlet存儲用於標記列表 - java的

起初,我在Servlet類,後來發現是錯誤舉行靜態字段,因爲這個領域是不是依然存在,當實例被摧毀所有的數據都迷路。

我已閱讀Memcache,但它不是最佳解決方案,因爲據我所知,如果應用內存不足,或者即使存在服務器故障,Memcache中的數據也可能會被擦除。

我不希望使用數據存儲,因爲它真的會請求慢得多。

我想我不是誰面臨的問題之首。 我該如何解決它?

回答

1

我用了一個相反的方法在我的應用程序之一:

每當一個新的客戶端連接,我產生一組三個隨機「挑戰」服務器(如您毫秒),這是我在內存緩存中存儲與上一分鐘左右的到期時間。然後我將這些挑戰傳達給客戶。對於客戶端的每個請求,它需要使用以下3個挑戰中的一個挑戰(用私鑰進行散列)。服務器然後刪除使用的挑戰,創建一個新的挑戰並將其發送到客戶端。這樣,每個挑戰都是一次性使用,我不必擔心重播攻擊。

這種方法有兩點要注意:

  • 我之所以產生三個方面的挑戰是允許在飛行並聯多個請求。
  • 你做出挑戰,就越有可能將是,這將是隨機重複使用(允許回放攻擊當時)的時間越長。
  • 如果memcache忘記我存儲的挑戰,那麼應用程序的請求將失敗。在失敗的時候,我會迴應一個「忘記所有其他挑戰並使用這3個新的挑戰:......」的命令。
  • 可以配合到客戶端的IP地址或者一些其他類型的會話信息的挑戰,使其更不可能有人能「砍」你。
  • 一般來說,讓服務器生成驗證的挑戰或鹽比向客戶端提供靈活性要好。

,如果你想堅持使用時間戳,您可以使用另一種方法是使用的第一個請求交換,以確定時間您的服務器實例和客戶端設備之間的偏移。然後,只接受帶有「當前」時間戳的請求。爲此,您需要確定可以獲得時間偏移的不確定性,並將其用作截止時間戳以使其不是最新的。爲防止在該截止時間段內發生重放攻擊,您可能需要保存並禁止使用最後幾個時間戳。這可以在您的實例中執行,因爲AppEngine AFAIK將來自同一客戶端的請求優先路由到同一個實例。然後,如果關閉一個實例並重新啓動一個實例(即清除禁止緩存)需要的時間比您的「當前」-cutoff所用的時間更長,那麼您不應該在重放攻擊方面出現太多問題。

+0

謝謝您的詳細解答。你面對挑戰的方式是好的,但有一些額外的開銷,我不確定我想添加到我的servlet中。我已經想到了你的另一種方式(有時間偏移),但是它留下了一些錯誤空間。我會接受你的回答,因爲它給了我很多很好的信息,但我想我會堅持我的方式,只使用Memcache。謝謝! – Elad92 2013-03-15 09:01:17

相關問題