2009-03-04 86 views
2

當用戶在我們的Struts應用程序中註冊時,我們想向他們發送一封電子郵件,其中包含指向其他頁面的鏈接。該鏈接需要在其查詢字符串中包含唯一標識符,以便目標頁面可以識別用戶並作出相應的反應。用Java保護查詢字符串的最佳方式是什麼?

爲了改善這種系統的安全性,我想先加密包含識別符的查詢字符串和第二設置鏈接到期 - 和/或幾天後它被使用之後。

什麼Java技術/方法,你會建議我用它來做到這一點?

回答

4

我打算讓你擔心一些假設:

  1. 用戶不應該能夠猜測其他用戶的URL。
  2. 一旦使用,URL不應該是可重複使用的(避免會話重播攻擊。)
  3. 無論是否使用,URL都不應該永遠活着,從而避免暴力探測。

以下是我想做到這一點。

  • 將用戶標識和過期時間戳記保存在表中。
  • 將這些連接成一個字符串,然後將SHA-1散列出來。
  • 使用SHA-1散列值生成URL。將所有這些URL映射到一個將進行驗證的servlet。
  • 當有人向你與哈希頁面的請求,用它來查找用戶和到期。
  • 用戶完成後無論着陸頁是應該做的,標誌着數據庫「拿來主義」的行。
  • 每天運行一個作業來清除已使用或超過其過期日期的行。
+0

這是一個很好的方法。然而,我只是選擇一個隨機的128位標識符,而不是散列。它更簡單,同樣安全,如果不是更多的話。 – erickson 2009-03-04 20:29:05

2

對於第一部分看看Generating Private, Unique, Secure URLs。過期時,您只需將唯一密鑰創建時間戳存儲在數據庫中,並且僅允許您的操作在例如​​now-keyCreatedAt 3天內執行。另一種方法是讓cron或Quartz作業定期刪除那些評估「now-keyCreatedAt < 3天」爲真的行。

0

我認爲你可以以無狀態的方式做到這一點,即沒有其他人建議的數據庫表。

  • 正如mtnygard建議的那樣,對網址參數和祕密鹽串進行SHA-1散列。
  • 將哈希值作爲URL上的必需參數添加。
  • 在電子郵件中發送URL。

當URL上的用戶點擊:

  • 再次計算散列,計算值與URL上的一個驗證URL的完整性。

只要你永遠不會泄漏你的祕密鹽串,沒有人能夠僞造對系統的請求。但是,與其他提議不同,這不妨礙重播舊的URL。根據你的情況,這可能是也可能不是理想的。

相關問題