簡體   English   中英

HTTP URL令牌標准

[英]HTTP URL token standard

我需要在系統中開發一個功能,允許未注冊的用戶通過由經過身份驗證的用戶生成/發送的URL令牌進行一次性系統訪問。

例如,用戶登錄並希望共享一條信息,以便系統生成URL,如http:// host / page?token = jkb345k4b5234k54kh5345kb34kb34 然后,此URL將發送給未注冊的用戶,該用戶將關注該URL以獲得對正常受保護數據的一些有限訪問權限。

第一個問題 - 是否有任何標准(RFC?IETF?其他?)將定義URL生成? 我能找到的唯一的是RFC2289OpenToken ,但這些都與我需要做的事情沒有直接關系,而后者只處於第二次草案狀態。

還有另一個設計考慮因素:是否使用單向加密散列函數並使用私有 - 公共密鑰對將有效負載存儲在本地數據存儲VS中,並在唯一字符串本身中編碼所有必需的有效負載。

目前我非常傾向於單向散列,因為它會給我更大的自由(有效載荷大小和生成的字符串之間沒有依賴關系),並且將來可能出現更少的潛在問題(例如,如果我決定增加更多的有效載荷,那么如何確保向后兼容性)。 最后但並非最不重要的是,意外暴露服務器端私鑰需要在密鑰重新生成,更新所有實例等方面付出巨大努力。如果選擇單向散列選項,這些問題都不相關,但也許我忽略了一些東西? RFC2289更喜歡單向加密功能,而OpenToken選擇密鑰對選項。

最后,是否有人知道任何Java庫用於生成這些?

提前致謝。

另請查看http://en.wikipedia.org/wiki/Universally_unique_identifierRFC4122 在后端內部,您需要將生成的uuid附加到您的實體,以便稍后可以基於UUID進行驗證。

除此之外,令牌通常可以包括一些數據(例如版本控制+用戶數據),然后使用安全的MD5哈希來對其進行“混淆/匿名化”。 之后,數據由服務器連接,並再次比較哈希值。

關於java-lib和uuid看看UUID-javadoc

生成隨機字符串並將其存儲在具有憑據的數據庫中。

生成的代碼需要具有兩個屬性:復雜性和唯一性。 復雜性確保無法猜測它們,並且唯一性確保永遠不會生成相同的代碼兩次。 除此之外,具體方法無關緊要。

生成包含兩部分的令牌字符串。 第一部分是時間相關的,其中密鑰將以每毫秒的可預測方式遞增和改變。 第二部分是完全隨機的。 結合起來,這將為您提供一個獨特而復雜的長字符串。

生成令牌時,使用在使用此令牌時授予的憑據將其存儲在數據庫中。 重要的是這些憑證不會編碼到字符串中,因為這可以確保不會被黑客攻擊。

當用戶單擊帶有令牌的鏈接時,將該令牌標記為在數據庫中使用。 更好的是設置使用時間戳,以便在第一次點擊后24小時可能過期。 這種方法使您可以靈活地實現項目所需的特定部分要求。

我之前在很多不同情況下都使用過這個解決方案,不僅可以進行一次性系統訪問,還可以使用門票代碼,禮券代碼以及一次性使用的任何東西。 用於生成令牌的內容並不重要,因為您可以保證其復雜性和唯一性。

這是我將如何做到這一點:

  1. 創建一個令牌(您可以使用UUID)並將其與創建時間以及令牌應授予訪問權限的資源一起添加到您的數據庫中
  2. 使用網址http://www.myserver.com/page?token=向用戶發送電子郵件
  3. 當用戶導航到url時,創建一個具有所需超時的新會話,並將該會話標記​​為已授權,以查看用戶應該能夠看到的數據庫(如果令牌不太舊。請檢查創建時間當前時間)
  4. 從數據庫中刪除令牌,或將其標記為已過期

當用戶共享一條信息時,您只需要一個令牌。 那么,你不能只生成一個隨機令牌,並將其與這條信息(例如數據庫字段)聯系起來嗎? 它比做任何加密的東西簡單得多......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM