我正在嘗試為一個簡單的 Sinatra CRUD 應用程式設定記住我的功能。
我找到了解釋如何通過設定隨機令牌和匿名用戶參考來構造它的答案。但是,建議的方法說要在足夠大的空間上隨機化,但我不清楚這實際上意味著什么?
我應該使用隨機生成的字母數字字串嗎?多長才夠?
這方面有什么標準做法嗎?
我正在看這個答案
uj5u.com熱心網友回復:
TL; 博士
盡可能使用維護良好的 gem 來生成登錄令牌,而不是自己滾動。然而,了解如何評估此類令牌的相對強度取決于數字范圍的大小和令牌生成中固有的熵。
理解空間和熵
“足夠大的空間”是在數學或密碼學意義上使用該術語。如果選擇的亂數只能在 1..10 的整數之間變化,則空間非常小。如果您的數字可以變化超過 128 位或更多,那么您有更大的空間可供選擇。這避免了碰撞的可能性。從數學上講,用于生成偽隨機值的熵量和種子值也會對生成數的整體安全性和抗碰撞性產生重大影響。
什么構成足夠大的空間取決于您的問題域。在許多情況下,由 Ruby 的SecureRandom#uuid方法生成的UUIDv4具有足夠的隨機性,可以被視為具有足夠隨機性以避免沖突的通用唯一識別符號。因為它(從實用的角度講)“普遍獨特”,所以對它進行加鹽或將其與其他資訊散列的效用價值可能是不必要的。但是,將 UUID 與用戶 ID 或用戶的其他唯一屬性相關聯仍然很重要,以便可以在 cookie、表單資料或查詢引數中使用該值將其與現有登錄名或任何其他登錄名相關聯資料是你試圖堅持的。
與其自己做這件事,不如使用像Devise這樣設計良好且維護良好的身份驗證機制來管理 Rails 登錄。授權也是如此,CanCan 等其他 gem 可能有用。無論哪種情況,都在為您處理身份驗證令牌中的沖突避免。
如果您自己動手,那么了解統計資料、熵以及故意或意外碰撞的風險非常重要。雖然這里的簡短答案根本無法解決潛在問題的復雜性,但它應該足以讓您開始并幫助您選擇當前問題所需的隨機性或唯一性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/491515.html
