消息代码验证算法

标签 algorithm language-agnostic checksum adler32 luhn

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

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

客户端 - 浏览我们的网页

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

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

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

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

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

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

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

抱歉进行了编辑,但是当我写第一篇文章时我的思绪一定在别处。

最佳答案

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

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

他们的代码:

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

您的代码:

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

关于消息代码验证算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/802039/

相关文章:

c++ - 反轴算法问题

c# - 平移工具算法非常不稳定

c - 在 C 中释放二叉树结构

language-agnostic - 为您的新员工提供绝对最低限度的培训计划

java - 实用程序员的练习 19

用于tcp校验和的c库函数

algorithm - 状态机适合解决什么样的问题?

language-agnostic - Code Golf : 2D Platformer

tcp - 你如何解读这句话?