如果你之前读过这个帖子 - 忘记我写的所有内容,我写这篇文章的时候一定是醉了。我重新开始了:
我目前正在开展一个项目,我们将使用某种算法来验证用户输入。有三方需要考虑;
客户 - 浏览我们的网页
公司 - 我们处理客户请求
第三方公司 - 处理客户留言
在我们的网页上,我们将向客户展示有关产品的一些信息。如果他/她想要了解有关产品的更多信息,他必须联系第三方公司并说明产品代码(本身并不是唯一的,但也不常见)。作为回报,客户将收到第三方公司的一些其他代码,他们应该在我们的网页上输入这些代码,我们将验证代码以供批准。
如果我们公司没有与第三方公司互动,那将是最好的。纯加密是不可能的,因为它会生成一个太长的字符串。我们通过短信这样做,所以代码必须简短。
到目前为止我想出了什么:
对于每个产品,我在基数16(0-f)中生成一些独特的代码(如果它是唯一的或不是真的无关紧要)。想要了解有关产品的更多信息的客户向第三方公司发送短信,说明产品代码。作为回报,客户端接收相同的代码,但是数字乘以(可能是2)并转换为基数36.除此之外,最后一个字符被添加到代码中,一个控制号,以使代码对Luhn有效用户输入接收到的代码,我们公司在服务器端根据产品代码对其进行验证(对Luhn进行验证,除以2并切换回基数16)。
这听起来相当安全和合适吗?它是否是三方发送消息的有效方式,当其中两方不需要通信时?
对于编辑感到抱歉,但是当我写第一篇文章时,我的想法一直在其他地方。
答案 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个字符。以下是我的想法:
答案 2 :(得分:1)
为何选择“校验和”?第三方不能运行你给他们的任何小实用程序吗?您只需要一个5位数的加密器,第三方可以在其计算机上运行,将产品代码输入,并将5位数结果作为密钥代码发送给客户端。
加密器始终从同一输入产生相同的结果。
然后,客户端会向您发送产品代码和密钥代码。您通过该加密器的精确副本运行产品代码,并将该结果与密钥代码进行比较。
可以在不改变基本架构的情况下增强该系统的安全性。
-Al。
答案 3 :(得分:1)
经过一些澄清后编辑:
我仍然认为产品代码和匹配的第三方响应不能保持不变 - 否则可以与其他用户共享,这样就可以在不进入第三方的情况下提供响应代码。
如果产品代码不变,可能的方法是第三方响应取决于 代码和用户的电话号码,您的验证也是如此。这样,每个响应都是产品和用户特定的。
Luhn算法的具体排列在我看来并不太重要 - 如果有人可以破解一个变异,他可能会破解另一个。
原始答案:
简而言之,我认为您可以使用Luhn算法,如果您向用户提供一次性票证,则在有限的时间内有效。
答案 4 :(得分:0)
经过与三方公司的长时间辩论,我们得出结论,如果他们将客户短信传递给我,最好的解决方案是,我会生成一个新的代码并将其发回给他们,然后又向他们发送新的短信给客户端使用我生成的代码。从我的观点来看并不是最优的,但至少我现在可以用我想要的任何方式来做。
感谢您的投入。