2008-11-27 101 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.