我正在开发一个应用程序,用户必须拨打电话并使用手机键盘输入验证码。
我希望能够检测出他们输入的数字是否正确。电话系统无法访问有效号码列表,而是根据算法(如信用卡号码)验证号码。
以下是一些要求:
鉴于这些要求,您将如何生成这样的数字?
编辑:
@Haaked:代码必须是数字,因为用户用手机输入代码。
@matt b:第一步,代码显示在网页上,第二步是调用并输入代码。我不知道用户的电话号码。
跟进:我发现了几种算法来检查数字的有效性(请参阅这个有趣的Google Code项目:checkDigits)。
发布于 2019-06-27 08:42:17
您想要分割代码。部分应该是其余代码的16位CRC。
如果您只想要一个验证码,那么只需使用一个序列号(假设您有一个生成点)。这样你知道你没有得到重复。
然后在序列前面加上该序列号的CRC-16和一些私钥。您可以将任何内容用于私钥,只要您将其保密即可。做一些大事,至少是一个GUID,但它可能是项目Gutenberg的战争与和平的文本。只需要保密和不变。使用私钥可以防止人们伪造密钥,但使用16位CR可以更容易破解密钥。
要验证您只是将数字分成两部分,然后采用序列号和私钥的CRC-16。
如果您想更多地模糊顺序部分,则将CRC分成两部分。在序列的前面放2个数字,在序列的后面放2个(零填充,因此CRC的长度是一致的)。
此方法也允许您从较小的键开始。前10个键将是6位数。
发布于 2019-06-27 09:14:15
对于1M组合,您需要6位数。为了确保没有任何意外有效的代码,我建议9位数字,随机代码的工作概率为1/1000。我还建议使用另一个数字(总共10个)来执行完整性检查。就分布模式而言,随机性就足够了,校验位将确保单个错误不会产生正确的代码。
编辑:显然我没有完全阅读您的请求。使用信用卡号码,您可以对其执行哈希(MD5或SHA1或类似的东西)。然后在适当的位置截断(例如9个字符)并转换为基数10.然后添加校验位,这应该或多或少地适用于您的目的。
https://stackoverflow.com/questions/-100001292
复制相似问题