2008-11-27 69 views
9

我需要生成隨機令牌,這樣當我稍後再看到它們時,我可以絕對確定它們實際上是由我生成的,也就是說,其他任何人都無法生成假令牌。這有點像序列號的產生,只是我不需要唯一性。實際上,它很像數字簽名,除了我是唯一一個需要驗證「簽名」的人之外。生成一個令牌,我可以證明我生成了

我的解決方案如下:

  1. 有一個祕密的串S(這不是在開放的唯一數據)
  2. 對於每個令牌,生成一個隨機字符串ķ
  3. 令牌= K + MD5(K + S)

驗證令牌是一個I產生:

  1. 分裂傳入令牌插入K + H
  2. 計算MD5(K + S),保證等於H

在我看來,它應該是不可能的任何人能夠可靠地生成H,給出ķ而不小號這個解決方案是否過於簡單?

+0

你如何將令牌拆分爲K + H?你怎麼知道什麼是K? – hasen 2008-11-27 06:46:12

+0

他在字符串的末尾添加了MD5,MD5的固定長度爲32個字符 – 2008-11-27 07:10:08

回答

3

您提出的解決方案是正確的。你本質上是執行challenge-response authentication。每個令牌可以由非祕密質詢字符串C和HMAC(C,K)組成,其中K是服務器的密鑰。

要驗證令牌,只需使用提供的值C重新計算HMAC並查看它是否與提供的HMAC值匹配。另外,正如Vinko提到的,你不應該使用MD5; SHA-256是一個不錯的選擇。

1

這不是太簡單,這當然是實現簡單數字簽名的有效方法。

當然,您無法向任何人證明其他您生成的簽名不會泄露您的密鑰S,但爲此您需要使用更復雜的協議,如PKI。

1

只是挑了一下你會證明只有無論誰有權訪問S可能已經生成了令牌。另一個小細節:使用更好的散列,如SHA256。因爲如果Mallory能夠產生碰撞,她甚至不需要知道S.