我有一种情况,我们打印出“折扣卡”,在卡上打印一个唯一的代码,用户可以在网上商店兑换折扣。
我们创建了这么多这样的卡,但实际使用的卡很少,所以我想使用某种形式的方法来识别有效的代码,而不是将每个单独的代码存储在数据库中。我们一次创建5000个这样的代码。大概一年5次吧。
理想情况下,我希望能够这样做:
$coupons->generate(5000, 'unique_salt', 'prefix_');这将产生5000个“随机”代码,如:
prefix-23-3424-4324-3344 or
prefix-4H-34RE-22K3-PE3Wunique salt和prefix_将保存到数据库中。然后,可以通过使用prefix_查找salt来验证这些代码,并将代码识别为有效或无效。
我有一个这样的形式,使用一个数字作为盐,找到可以被盐整除的数字,然后重新排序数字,使其看起来是随机的。有了足够长的代码,需要一些工作才能弄清楚模式。但我想有个更好的办法...因为只有这么多的数字才能产生大量可以被salt整除的代码。
(例如,盐值2将产生1到10,000之间的5,000个代码(并且很容易看到模式)……但是14000的盐将产生1到10,000之间的零代码)
这样做的另一个好处是,我可以根据需要生成优惠券(例如,当我们逐个给个人折扣时),并能够根据prefix_跟踪使用了哪些优惠券,等等。并潜在地了解如何/何时分发卡片,什么能产生最好的回报。
当我应该将每个代码存储在数据库中时,我是不是在旋转我的轮子?(或者只是玩玩?) :)
发布于 2011-05-11 05:39:55
您要查找的是称为部分密钥验证的部分密钥验证,如软件光盘上的序列号:)
看一看:
http://47hats.com/2007/07/implementing-a-partial-serial-number-verification-system/
http://www.codeproject.com/KB/security/cdkeys.aspx
http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/
干杯
发布于 2011-05-11 06:41:39
您可以使用HMAC和适当的编码方案来实现这一点。首先,为HMAC生成一个密钥,并确保对其保密。要生成每个令牌,请执行以下操作:
生成一个序列号,可以是随机的,也可以是顺序的--最重要的是,它用密钥将序列号的unique.
要验证代码,请执行以下操作:
发布于 2011-05-11 05:33:11
一种标准的技术是对盐和数字使用单向散列来创建一个大的随机数字。然后使用这个散列来生成您的神秘代码。有很多标准的单向散列可以使用。MD5是一种常见的方法。
为了让你的生活更简单,我会以一种简单的方式将数字嵌入到代码中。例如,prefix-2_-3_-4_-3___将是代码2343,然后您将使用来自MD5的数据"prefix salt number“来填充空格。这可以简单地说,您有一个数字和字符的字母表,您愿意在其中使用n内容。使用MD5 mod n来选择您的第一个字符。将MD5除以n。然后重复,直到你有了你的角色。为了验证它,获取前缀,查找盐,提取数字,计算MD5,然后按照相同的过程生成代码中应该包含的其他字符。
https://stackoverflow.com/questions/5956613
复制相似问题