Algorithm 消息代码验证算法

Algorithm 消息代码验证算法,algorithm,language-agnostic,checksum,adler32,luhn,Algorithm,Language Agnostic,Checksum,Adler32,Luhn,如果你以前读过这篇文章-忘了我写的所有东西,我写这篇文章的时候一定是喝醉了。我重新开始: 我目前正在做一个项目,我们将使用某种算法来验证用户输入。有三方需要考虑;p> 客户端-浏览我们的网页 公司-我们,处理客户请求 第三方公司-处理客户端消息 在我们的网页上,我们将向客户展示一些关于产品的信息。如果他/她想要更多关于产品的信息,他/她必须联系第三方公司并说明产品代码(本身不是唯一的,但也不是通用的)。作为回报,客户将从第三方公司收到一些其他代码,他应该在我们的网页上输入这些代码,我们将验证这些

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

我目前正在做一个项目,我们将使用某种算法来验证用户输入。有三方需要考虑;p> 客户端-浏览我们的网页

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

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

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

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

到目前为止我的想法:

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

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


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

我想你把事情弄糊涂了,例如,如果你使用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

我认为你把事情弄糊涂了,例如,如果你使用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

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

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

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

      • 使用10个字符,这将使暴力攻击更加困难
      • 使用所有拉丁字母和数字-这将给你36个可能的字符值
      • 为什么不使用一些大的数字库,并简单地将您的代码(作为Base36数字)乘以一些非常大的值(比如2048个随机位)。然后将其转换为Base36并取最后10位数字。或者可能是前5名和后5名。或者可能是依赖于原始代码的其他组合。我不知道这在加密方面会有多强大(可能不会太多),但破解代码的努力无疑会比仅仅支付服务费用要小
      • 或者,您可以在代码中添加盐(预先添加一些秘密字符串),然后计算代码的MD5。将MD5(或其中的一些N个字符)作为代码返回给用户。这应该是相当好的加密,虽然我不是专家。通过将MD5结果转换为Base36,可以增强此算法的强度
        • 为什么是“校验和”?第三方不能运行您提供给他们的任何小实用程序吗?你所需要的只是一个5位数的加密机,第三个pa