可加密連結的隨機令牌
是否有任何算法/協議可以讓您生成特定長度的隨機令牌/位,以便您可以加密確定使用相同種子/密鑰生成的 2 個或更多令牌/位串。有可能嗎?
例如,如果我生成這些隨機位:
12432
,15693
, 使用密鑰 A 和57322
,57483
使用密鑰 B。我希望第三方獲得12432
併15693
能夠確定它們都是在同一個密鑰下生成的。我認為數字簽名是顯而易見的解決方案。但是,數字簽名對我的要求來說太長了。我希望令牌的長度在 10-20 位之間,任何指針都將不勝感激。
要求:
- 第三方應該能夠驗證令牌是否有效。
- 理想情況下,第三方應該無法偽造代幣。
- 令牌對於單個密鑰必須是唯一的。
一個完整的解決方案是不可能的。如果第三方能夠驗證令牌的有效性,他們可以通過 10-20 位令牌空間暴力破解並生成所有有效令牌。所以第三方不能既能驗證又不能偽造。以下解決方案實現了兩者之一。
綁定每個密鑰 $ k_i $ 到一個標識符 $ i $ . 生成表單的令牌 $ i||H(k_i, x) $ 在哪裡 $ x $ 是一個很小的值。 $ H $ 例如,可以將 HMAC-SHA256 截斷為 ~16 位。為了唯一性,生成器應該丟棄任何與它之前的值衝突的值( $ x < x’ $ )。由於域很小,這仍然非常快。
任何不知道密鑰的人都無法驗證令牌是否有效,但可以查看第一個位以查看它是否有效。擁有密鑰的人可以迭代 $ x $ 直到他們找到一個匹配的或者他們退出(在某個定義的上限,比如 $ 2^{8} $ )。上限和令牌長度決定了使用隨機位串生成偽造的機率——8 位和 16 位的機率約為 $ 2^{-8} $ .
如果第三方是可信的*,並且*允許不同key下生成的token發生衝突,那麼標識符 $ i $ 可以省略。但是,您無法唯一確定誰生成了特定值。
使用小塊密碼可以避免上述衝突。然而,在我看來,安全地實現這樣的分組密碼比僅僅檢查衝突更複雜。對於大量令牌,情況可能並非如此。