2008-10-13 70 views
7

因此,我需要生成一个代码,可以绑定到一个特定的用户/潜在客户,其中内置了美元数量。它需要是可逆的,以便客户应用程序可以确认代码的有效性并应用经理打算的折扣。生成用户特定的1次优惠券代码

我想尽可能缩短代码,但它需要很好的模糊处理,以便推销员不能自己动手。

我可以想出一些自己弹出数字的东西,除以pi并转换为十六进制,不过我会对社区的想法或最佳实践感兴趣。

我在C#中这样做,但我期望可以翻译任何语言的方法。

编辑: 澄清。我不能提前储存这些东西,代码必须随时建立并随身携带所有信息。

例如。推销员14打电话给客户773,并想给他们500美元的订单。 14,773和500必须位于优惠券代码中,并且可以在推销员键入代码后在客户端应用程序中提取。

+0

你能在这里澄清协议?听起来你有很多派对,一个推销员S,一个客户(客户?)C,一个中央数据库D和一个客户端应用程序A.谁和谁谈话,以什么顺序谈话,哪个派对告诉哪个对方什么? ?没有这个,很难回答你的问题。 – 2008-12-11 16:59:25

回答

7

生成用于签名的公钥/私钥对。使用私钥对用户ID和优惠券值的组合进行数字签名。将优惠券值+签名发布为优惠券代码,例如使用字母和数字进行编码。客户端应用程序将通过重新创建最初签名的数据组合(例如,将用户ID预先添加到优惠券值)并验证数字签名来验证代码。

2

我会使用客户代码和优惠券到期日期。至于验证,您可以将有效的优惠券存储在数据库中并进行验证。您可以每天扫描一次优惠券表以清除过期的代码。

+0

有些国家(如瑞士),依法优惠券永不过期(即使通常会在优惠券上打印到期日期)。用发放日期替换到期日期。 – 2008-10-13 12:33:59

+0

我喜欢这个答案,因为它为所有其他依赖密码学的答案提供了一个很好的选择。关于此解决方案唯一要注意的是,您无法在离线模式下验证优惠券代码。 – Alexander 2008-10-13 12:46:04

+0

稍微更干净的解决方案导致更短的优惠券代码,是生成完全随机的短优惠券ID(例如,8个字母数字数字长),将它们连同所有相关优惠券信息一起存储在数据库中,例如客户ID,代表ID ,优惠券价值,到期... – Alexander 2008-10-13 12:51:32

5

听起来就像是非对称加密的情况。您可以将公钥分配给每个人,从而为他们提供验证优惠券的信息,但是创建帐户的能力将取决于私钥的所有者(=您)。

我会创建一个串行化到XML的优惠券类,然后加密xml字符串。验证将解密字符串,看看它是否是有效的XML(我建议不要反序列化的对象之前没有检查这一点)。

1

我从你的措辞,你不想代码存储在数据库中(如果你没有,你可以简单地验证对数据库中的每个代码)

所以问题的方式猜测,是什么你可以做的就是获取有关优惠券内容的所有相关信息,然后将它与一个秘密盐一起散列以防止篡改。

因此,假设你想的优惠券供用户23价值$ 200,你可以建立一个字符串,如“23_200”,并以“BillTheLizard”的秘密盐计算MD5哈希得到2671519131e974ee6fc746151e98f4a8,因此,完整的代码,你给顾客是200_23_2671519131e974ee6fc746151e98f4a8

现在,当您收到的代码,你打破它拆开,并检查MD5(“200_23” +秘密)= 2671519131e974ee6fc746151e98f4a8验证该值

编辑:如果一个32字符的哈希太长了,你总是可以截断它,例如把它砍到8个字符仍然会给你4294967296不同的散列值。

1

这只是总结迄今为止的答案。有生成这样的优惠券代码的两个主要不同的方式:

  1. 集中式解决方案:关于每个优惠券的信息被存储在数据库中。然后可以随机生成优惠券代码并且简短 - 它只是对数据库中记录的引用,其中包含所有必要信息,例如优惠券价值,客户ID,代表ID。验证这样的代码需要在线访问您的服务器。

  2. 分散式解决方案:优惠券是一种独立的信息,可以在离线模式下进行验证,无需访问任何服务器。结果,优惠券代码必须包含一些(甚至全部)信息。最安全的方法是使用非对称密码术或Message Authentication Code,以便私人密钥持有者(您)以外的任何人都不能生成优惠券。

1

史蒂夫·吉布森谈到他的网站上关于一次性密码,但没有理由你不能用它来创建一个时间的优惠券代码:http://grc.com/ppp

相关问题