代码之家  ›  专栏  ›  技术社区  ›  Craig Day

生成一个我可以证明我生成的令牌

  •  9
  • Craig Day  · 技术社区  · 16 年前

    我需要生成随机令牌,这样当我稍后看到它们时,我可以确定它们确实是由我生成的,也就是说,其他人几乎不可能生成假令牌。它有点像序列号生成,只是我不需要唯一性。实际上,它很像一个数字签名,除了我是唯一需要验证“签名”的人。

    我的解决方案如下:

    1. 有一个秘密字符串s(这是唯一不在打开状态的数据)
    2. 对于每个令牌,生成一个随机字符串k
    3. 令牌=K+MD5(K+S)

    要验证令牌,我会生成一个:

    1. 将传入令牌拆分为k+h
    2. 计算MD5(k+s),确保等于h

    在我看来,没有s的k,任何人都不可能可靠地生成h。这个解是否过于简单化?

    4 回复  |  直到 16 年前
        1
  •  3
  •   Chris Kite    16 年前

    你提出的解决方案是正确的。你基本上是在表演 challenge-response authentication 你自己。每个令牌可以由非机密质询字符串C和HMAC(C,K)组成,其中K是服务器的密钥。

    要验证令牌,只需使用提供的C值重新计算HMAC,并查看它是否与提供的HMAC值匹配。

    另外,正如Vinko提到的,您不应该使用MD5;SHA-256是一个不错的选择。

        2
  •  5
  •   Dustin    16 年前

    退房 HMAC .

        3
  •  1
  •   Greg Hewgill    16 年前

    这不是太简单,这当然是实现简单数字签名的有效方法。

    当然,你不能向任何人证明 其他的 您生成了签名而没有透露您的秘密密钥,但是为了这个目的,您需要使用更复杂的协议,如pki。

        4
  •  1
  •   Vinko Vrsalovic    16 年前

    只是为了吹毛求疵,你会证明 只有 谁有权访问S,谁就可以生成令牌。另一个小细节:使用更好的哈希,比如sha256。因为如果马洛里能够产生碰撞,她甚至不需要知道S。