如果要生成刮刮卡类型的密码,则必须使用大数字,大约 13 位长;而且,它们必须类似于信用卡号码,在号码本身中嵌入校验和或验证数字。您必须有一个算法来根据一些初始数据生成一个 pin,这些初始数据可以是一个数字序列。生成的 pin 对于序列中的每个数字必须是唯一的,因此如果您生成 100,000 个 pin 码,它们都必须不同。这样,您不仅可以通过对照数据库检查数字来验证数字,还可以先验证它。
我曾经为此目的写过一些东西,我不能给你代码,但总体思路是这样的:
- 准备一个12位数的空格
- 将数字格式化为五位数字(00000 到 99999),并以某种方式沿空间分布。例如,数字 12345 可以扩展为 __3_5_2_4__1。您可以根据它是偶数还是奇数,或 3 的倍数等来改变分配数字的方式。
- 根据某些数字的值,生成更多的数字(例如,如果第三个数字是偶数,则创建一个奇数并将其放入第一个空位,否则创建一个偶数并将其放入第二个空位,例如_83_5_2_4__1
- 生成 6 位数字后,您将只有一个空位。您应该始终保留相同的开放空间(例如倒数第二个空间)。您将在该位置放置验证码。
- 要生成验证数字,您必须对生成的数字执行一些算术运算,例如将奇数位置的所有数字相加并乘以其他数字,然后减去偶数位置的所有数字,最后将所有数字相加数字在一起(您必须根据某些数字的值稍微改变算法)。最后,您有一个验证数字,您将其包含在生成的密码中。
所以现在您可以验证您生成的密码。对于给定的密码,您生成验证数字并与密码中包含的数字进行核对。如果没问题,那么您可以通过执行相反的操作来提取原始数字。
这听起来不太好,因为它看起来像是通过默默无闻的安全性,但这是您可以使用它的唯一方法。有人猜出密码并非不可能,但作为带有验证码的 12 位密码,这将非常困难,因为您必须尝试 1,000,000,000,000 种组合,而您只有 100,000 个有效密码,因此对于那里的每个有效密码是 10,000,000 个无效的。
我应该提一下,这对于一次性密码很有用;一个人只使用一次这些代码之一,例如为预付费电话充电。将这些引脚用作身份验证令牌不是一个好主意,尤其是如果这是对某人进行身份验证的唯一方法(您永远不应该仅通过一条数据对某人进行身份验证;最低要求是用户名+密码)