【问题标题】:Algorithm for message code validation消息代码验证算法
【发布时间】:2010-10-22 13:40:07
【问题描述】:

如果你以前读过这个帖子 - 忘记我写的所有内容,我写它的时候一定是喝醉了。我要重新开始:

我目前正在开展一个项目,我们将使用某种算法来验证用户输入。需要考虑三个方面;

客户端 - 浏览我们的网页

公司 - 我们,处理客户的请求

第 3 方公司 - 处理客户消息

在我们的网页上,我们将向客户展示有关产品的一些信息。如果他/她想了解有关产品的更多信息,他必须联系第 3 方公司并说明产品代码(本身不是唯一的,但也不常见)。作为回报,客户将收到来自第三方公司的一些其他代码,他应该在我们的网页上输入这些代码,我们将在其中验证代码以供批准。

如果我们公司没有与第 3 方公司互动,那最好。纯加密是不可能的,因为它会生成一个太长的字符串。我们是通过短信来做的,所以代码必须很短。

到目前为止我的想法:

对于每件产品,我都会在基数 16 (0-f) 中生成一个有点独特的代码(它是否唯一并不重要)。想要了解有关产品的更多信息的客户向第三方公司发送一条短信,说明产品代码。作为回报,客户端收到相同的代码,但数字被乘以(可能乘以 2)并转换为基数 36。除此之外,最后一个字符被添加到代码中,即控制号,以使代码对 Luhn 有效以 36 为基数的算法。用户输入收到的代码,我们公司在服务器端根据产品代码验证它(根据 Luhn 验证,除以 2 并切换回以 16 为基数)。

这听起来相当安全和适当吗?当三方不需要通信时,三方发送消息是一种有效的方式吗?

抱歉编辑,但当我写第一篇文章时,我的想法一定在别处。

【问题讨论】:

  • 我认为您需要稍微澄清一下您的问题。校验和和其他哈希码的想法是避免任何给定的两条消息具有相同的代码。安全哈希码试图尽可能难地找到具有相同代码的任何两条消息,因此我看不出您如何期望安全性,同时生成具有与初始产品代码匹配的校验和的答案代码是可行的。为什么还需要这么复杂的方案?
  • 那么你能或不能控制第三者的行为吗?
  • 因此,如果您选择不以任何方式影响第 3 方所做的事情,那么您完全依赖于他们为您提供的选项。他们为您提供了哪些选择?卢恩算法是其中之一吗?
  • 我意识到这实际上是一种加密方式 - 但不是很安全:)
  • 我不确定我是否了解您要防范的威胁场景 - 您不想发生什么?您是否在不联系第三方的情况下对其进行验证?

标签: algorithm language-agnostic checksum adler32 luhn


【解决方案1】:

我认为您在混淆事物,例如,如果您使用 Luhn 算法,它只会在校验和上返回 TrueFalse。您提供的示例代码似乎表明您想要一些可以从两个不同值散列的校验和结果(例如 12345)。这个问题会更难。

第三方将如何创造这个价值?你会给他们一些 Javascript 代码让他们执行,还是其他语言?难道你不能有一个共享的密钥,他们可以用那个密钥对称地加密值,你可以让他们在他们加密的部分前面加上一些已知的值,这样你就可以快速验证它。

他们的代码:

  to_send = encrypted(shared_key, 'check' + code)

您的代码:

  unencrypted = decrypt(shared_key, to_send)
  if not unencrypted.startswith('check'):
    return False # failed check

【讨论】:

    【解决方案2】:

    好的,因此您不希望其他应用程序与您的应用程序之间发生交互。并且您想将代码限制为 6 个字符。以下是我的想法:

    • 使用 10 个字符,这将使暴力攻击更加困难;
    • 使用所有拉丁字母和数字 - 这将为您提供 36 个可能的字符值;
    • 为什么不使用一些大数字库并简单地将您的代码(作为 Base36 数字)乘以一些可笑的大值(例如,2048 个随机位)。然后将其转换为 Base36 并取最后 10 位数字。或者可能是前 5 个和后 5 个。或者可能是依赖于原始代码的其他组合。我不知道这在密码学上会有多强(可能不多),但破解密码的努力无疑会比简单地为服务付费要小。
    • 或者,您可以加盐(添加一些秘密字符串)您的代码,然后计算它的 MD5。将 MD5(或其中的一些 N 个字符)作为您的代码返回给用户。尽管我不是专家,但这在密码学上应该是可以的。通过将 MD5 结果转换为 Base36,您可以提高该算法的强度。

    【讨论】:

    • 通过允许所有数字和字符将其设为 Base 36。
    • 出于什么特殊原因?您的最终答案是基于 36 的 Luhn 算法? :)
    • 不,这是对您选择使用什么的一般建议。
    【解决方案3】:

    为什么是“校验和”?第三方不能运行你给他们的任何小工具吗?您只需要一个 5 位数的加密器,第三方可以在他们的计算机上运行,​​将产品代码输入,并将 5 位数的结果作为密钥代码发送给客户端。

    加密器总是从相同的输入产生相同的结果。

    然后,客户端将产品代码和密钥代码发送给您。您通过该加密器的精确副本运行产品代码,并将该结果与密钥代码进行比较。

    可以在不改变基本架构的情况下增强该系统的安全性。

    -阿尔。

    【讨论】:

      【解决方案4】:

      经过一些澄清后编辑

      我仍然认为产品代码和匹配的第 3 方响应不能保持不变 - 否则可以共享给其他用户,从而可以在不去第 3 方的情况下提供响应代码。

      如果产品代码是不变的,一种可能的方法是,第 3 方响应取决于代码和用户的电话号码两者,您的验证也是如此。这样,每个响应都是针对产品和用户的。

      在我看来,Luhn 算法的特定排列并不太重要——如果有人能破解一种变体,他可能也能破解另一种。

      原答案

      简而言之,我认为你可以使用 Luhn 算法,如果你给用户一张一次性票,在有限的时间内有效。

      • 首先,如果我对问题的理解正确,您的产品代码不能保持不变 - 否则第 3 方创建的响应对于该产品将始终相同。这意味着用户以后可以再次使用此代码,甚至可以将其提供给其他用户。
      • 因此,我认为您应该根据用户对信息/访问产品的请求生成并给他一个随机的新代码。此代码应在有限的时间段内(一小时、一天,具体取决于您的需要)对该产品有效。
      • 第 3 方发送给用户的响应只有在与您提供给用户的代码一起输入时才有效。
      • 验证后,此代码在指定时间段结束后才能使用。
      • 作为一种选择,我认为您和第 3 方可以在计算期间将当前日期之类的内容附加到代码和响应对中,因此它们并不总是相同的对。

      【讨论】:

      • 好点。但是对于协议而言,客户端是否可以在第二次或第三次对同一产品使用相同的代码并不重要。实际上完全没问题。 :) 感谢您的输入。当你写这个答案时,我编辑了我的第一篇文章:)
      【解决方案5】:

      经过与 3 方公司的长期辩论,我们得出结论,最好的解决方案是,如果他们将客户的 SMS 传递给我,我会生成一个新代码并将其发回给他们,然后他们再将新的 SMS 发送给使用我生成的代码的客户端。从我的角度来看不是最佳的,但至少我现在可以以任何我想要的方式做到这一点。

      感谢您的意见。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 2018-01-28
        • 2018-09-05
        • 1970-01-01
        相关资源
        最近更新 更多