0

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

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

客户 - 浏览我们的网页

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

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

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

如果我们公司与第三方公司没有任何互动,那就最好不过了。纯加密是不可能的,因为它会生成一个太长的字符串。我们通过 SMS 进行此操作,因此代码必须简短。

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

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

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

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

4

5 回答 5

2

我认为您在混淆事物,例如,如果您使用 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
于 2009-04-29T12:24:58.420 回答
1

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

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

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

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

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

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

-阿尔。

于 2009-04-29T21:48:25.350 回答
1

一些澄清后编辑

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

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

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

原答案

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

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

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

感谢您的输入。

于 2009-05-14T10:08:50.887 回答