首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据算法创建一组“优惠券代码”;不需要存储代码

根据算法创建一组“优惠券代码”;不需要存储代码
EN

Stack Overflow用户
提问于 2011-05-11 05:21:08
回答 3查看 9K关注 0票数 8

我有一种情况,我们打印出“折扣卡”,在卡上打印一个唯一的代码,用户可以在网上商店兑换折扣。

我们创建了这么多这样的卡,但实际使用的卡很少,所以我想使用某种形式的方法来识别有效的代码,而不是将每个单独的代码存储在数据库中。我们一次创建5000个这样的代码。大概一年5次吧。

理想情况下,我希望能够这样做:

代码语言:javascript
复制
$coupons->generate(5000, 'unique_salt', 'prefix_');

这将产生5000个“随机”代码,如:

代码语言:javascript
复制
prefix-23-3424-4324-3344 or
prefix-4H-34RE-22K3-PE3W

unique saltprefix_将保存到数据库中。然后,可以通过使用prefix_查找salt来验证这些代码,并将代码识别为有效或无效。

我有一个这样的形式,使用一个数字作为盐,找到可以被盐整除的数字,然后重新排序数字,使其看起来是随机的。有了足够长的代码,需要一些工作才能弄清楚模式。但我想有个更好的办法...因为只有这么多的数字才能产生大量可以被salt整除的代码。

(例如,盐值2将产生1到10,000之间的5,000个代码(并且很容易看到模式)……但是14000的盐将产生1到10,000之间的零代码)

这样做的另一个好处是,我可以根据需要生成优惠券(例如,当我们逐个给个人折扣时),并能够根据prefix_跟踪使用了哪些优惠券,等等。并潜在地了解如何/何时分发卡片,什么能产生最好的回报。

当我应该将每个代码存储在数据库中时,我是不是在旋转我的轮子?(或者只是玩玩?) :)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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/

干杯

票数 5
EN

Stack Overflow用户

发布于 2011-05-11 06:41:39

您可以使用HMAC和适当的编码方案来实现这一点。首先,为HMAC生成一个密钥,并确保对其保密。要生成每个令牌,请执行以下操作:

生成一个序列号,可以是随机的,也可以是顺序的--最重要的是,它用密钥将序列号的unique.

  • Compute
  1. (我建议使用HMAC-SHA1)。这将为您提供一个散列值(在HMAC-SHA1).
  2. Concatenate的情况下为160位)序列号和部分散列值。这是您的优惠券代码。您使用的哈希值的位数决定了通过暴力破解创建有效代码的难度-使用n位意味着您的攻击者必须(平均)尝试2^(n-1)个代码才能找到有效代码。使用散列中的哪些位并不重要。

要验证代码,请执行以下操作:

  1. 检查序列号是否已存在于您的数据库中,以将序列号的HMAC与代码其余部分中的相关位进行兑换。
  2. 将序列号添加到您的数据库中,以将其注册为已使用。
票数 2
EN

Stack Overflow用户

发布于 2011-05-11 05:33:11

一种标准的技术是对盐和数字使用单向散列来创建一个大的随机数字。然后使用这个散列来生成您的神秘代码。有很多标准的单向散列可以使用。MD5是一种常见的方法。

为了让你的生活更简单,我会以一种简单的方式将数字嵌入到代码中。例如,prefix-2_-3_-4_-3___将是代码2343,然后您将使用来自MD5的数据"prefix salt number“来填充空格。这可以简单地说,您有一个数字和字符的字母表,您愿意在其中使用n内容。使用MD5 mod n来选择您的第一个字符。将MD5除以n。然后重复,直到你有了你的角色。为了验证它,获取前缀,查找盐,提取数字,计算MD5,然后按照相同的过程生成代码中应该包含的其他字符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5956613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档