我需要生成随机令牌,这样当我稍后看到它们时我绝对可以确定它们实际上是由我生成的,即其他人几乎不可能生成假令牌。这有点像序列号生成,除了我不需要唯一性。实际上,它很像数字签名,除了我是唯一需要验证“签名”的人。
我的解决方案如下:
验证令牌是我生成的令牌:
在我看来,任何人都不可能可靠地生成H,假设K没有S.这个解决方案太简单了吗?
答案 0 :(得分:5)
查看HMAC。
答案 1 :(得分:3)
您提出的解决方案是正确的。你基本上是在做自己的challenge-response authentication。每个令牌可以包含一个非秘密质询字符串C和HMAC(C,K),其中K是您服务器的密钥。
要验证令牌,只需使用提供的C值重新计算HMAC,并查看它是否与提供的HMAC值匹配。
另外,正如Vinko所说,你不应该使用MD5; SHA-256是一个不错的选择。
答案 2 :(得分:1)
这不是太简单,这当然是实现简单数字签名的有效方式。
当然,您无法向任何人 else 证明您在不泄露您的密钥S的情况下生成了签名,但为此您需要使用更复杂的协议,如PKI。< / p>
答案 3 :(得分:1)
只是为了挑剔,你会证明只任何有权访问S的人都可以生成令牌。另一个小细节:使用更好的哈希,比如SHA256。因为如果马洛里能够产生碰撞,她甚至不需要知道S。