消息代码验证算法

时间:2009-04-29 12:01:29

标签: algorithm language-agnostic checksum adler32 luhn

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

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

客户 - 浏览我们的网页

公司 - 我们处理客户请求

第三方公司 - 处理客户留言

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

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

到目前为止我想出了什么:

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

这听起来相当安全和合适吗?它是否是三方发送消息的有效方式,当其中两方不需要通信时?

对于编辑感到抱歉,但是当我写第一篇文章时,我的想法一直在其他地方。

5 个答案:

答案 0 :(得分:2)

我认为你很混乱,例如,如果你使用Luhn算法,它只会在校验和上返回 True False 。您提供的示例代码似乎表明您希望得到一些校验和结果(例如12345),可以从两个不同的值进行哈希处理。这个问题会更加困难。

第三方如何创造这个价值?你会给他们一些Javascript代码供他们执行,还是其他一些语言?你有没有一个共享密钥,他们可以使用该密钥对称加密值,你可以让他们用他们用一些已知值加密的部分作为前缀,这样你就可以快速验证它。

他们的代码:

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

您的代码:

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

答案 1 :(得分:1)

好的,所以你不希望其他应用程序和你的应用程序之间有任何交互。并且您希望将代码限制为6个字符。以下是我的想法:

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

答案 2 :(得分:1)

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

加密器始终从同一输入产生相同的结果。

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

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

-Al。

答案 3 :(得分:1)

经过一些澄清后编辑

我仍然认为产品代码和匹配的第三方响应不能保持不变 - 否则可以与其他用户共享,这样就可以在不进入第三方的情况下提供响应代码。

如果产品代码不变,可能的方法是第三方响应取决于 代码和用户的电话号码,您的验证也是如此。这样,每个响应都是产品和用户特定的。

Luhn算法的具体排列在我看来并不太重要 - 如果有人可以破解一个变异,他可能会破解另一个。

原始答案

简而言之,我认为您可以使用Luhn算法,如果您向用户提供一次性票证,则在有限的时间内有效。

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

答案 4 :(得分:0)

经过与三方公司的长时间辩论,我们得出结论,如果他们将客户短信传递给我,最好的解决方案是,我会生成一个新的代码并将其发回给他们,然后又向他们发送新的短信给客户端使用我生成的代码。从我的观点来看并不是最优的,但至少我现在可以用我想要的任何方式来做。

感谢您的投入。