【问题标题】:Generating a token that I can prove I generated生成一个我可以证明我生成的令牌
【发布时间】:2008-11-27 06:41:28
【问题描述】:

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

我的解决方法如下:

  1. 有一个秘密字符串 S(这是唯一没有公开的数据)
  2. 对于每个token,生成一个随机字符串K
  3. 令牌 = K + MD5(K + S)

验证令牌是我生成的:

  1. 将传入令牌拆分为 K + H
  2. 计算MD5(K + S),确保等于H

在我看来,在没有 S 的情况下,任何人都不可能可靠地生成 H。这个解决方案是否过于简单?

【问题讨论】:

  • 如何将token拆分为K+H?你怎么知道 K 是什么?
  • 他在字符串末尾加上MD5,MD5固定长度为32个字符

标签: security encryption


【解决方案1】:

查看HMAC

【讨论】:

  • HMAC 还打算验证消息。但当然,这是一种更安全的方法,几乎​​不需要额外费用。
  • 绝对是一个 MAC 应用程序,因为它是你自己证明的。不确定它们是否适用于此,但重放攻击需要仔细考虑。 OP 在正确的轨道上,但使用公认的 MAC 算法,而不是尝试重新发明一个。
【解决方案2】:

您提出的解决方案是正确的。你实际上是在和自己一起表演challenge-response authentication。每个令牌都可以包含一个非秘密质询字符串 C 和 HMAC(C, K),其中 K 是您服务器的密钥。

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

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

【讨论】:

    【解决方案3】:

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

    当然,您无法向任何人else证明您在不泄露您的密钥 S 的情况下生成了签名,但为此您需要使用更复杂的协议,例如 PKI。

    【讨论】:

      【解决方案4】:

      只是挑剔一点,您将证明有权访问 S 的人可以生成令牌。另一个小细节:使用更好的哈希,比如 SHA256。因为如果 Mallory 能够产生碰撞,她甚至不需要知道 S。

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 2019-02-03
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多