代码之家  ›  专栏  ›  技术社区  ›  Björn

消息代码验证算法

  •  0
  • Björn  · 技术社区  · 15 年前

    如果你以前读过这篇文章-忘了我写的所有东西 ,我写的时候一定是喝醉了。我要重新开始:

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

    客户端-浏览我们的网页

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

    第三方公司-处理客户端消息

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

    最好的情况是,如果我们,公司,没有与第三方公司的互动。纯加密不在图片中,因为它生成的字符串太长。我们是通过短信来做到这一点的,所以密码一定要短。

    到目前为止,我想到的是:

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

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

    很抱歉编辑,但我写第一篇文章的时候一定是在别的地方。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Scott Kirkwood    15 年前

    我觉得你很困惑,例如,如果你使用luhn算法,它会返回 在校验和上。您给出的示例代码似乎表明您想要一些校验和结果(例如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
  •  1
  •   Vilx-    15 年前

    好的,所以您不希望在另一个应用程序和您的应用程序之间进行交互。您希望将代码限制为6个字符。以下是我的想法:

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

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

    加密程序总是从相同的输入中产生相同的结果。

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

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

    - Al。

        4
  •  1
  •   Yevgeny Doctor    15 年前

    澄清后编辑 :

    我仍然认为产品代码和匹配的第三方响应不能是恒定的-否则它可以被其他用户共享,从而能够在不访问第三方的情况下给出响应代码。

    如果产品代码是常量,则可能的方法是第三方响应取决于 二者都 代码和用户的电话号码,以及您的验证。这样,每个响应都是特定于产品和用户的。

    在我看来,luhn算法的具体排列并不太重要——如果有人能破解一个变体,他可能就能破解另一个变体。

    原始答案 :

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

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

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

    谢谢你的投入。

    推荐文章