8

因此,我需要生成一个代码,该代码可以与特定用户/潜在客户相关联,并内置美元金额。它需要是可逆的,以便客户端应用程序可以确认代码的有效性并应用经理想要的折扣。

我想让代码尽可能短,但它需要被很好地混淆,这样销售人员就不能自己开始弄乱它。

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

我在 C# 中执行此操作,但我希望可以翻译任何语言的方法。

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

例如。推销员 14 打电话给客户 773,希望给他们 500 美元的订单折扣。14、773 和 500 必须在优惠券代码中,并且能够在销售人员键入代码后在客户端应用程序中提取。

4

7 回答 7

7

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

于 2008-10-13T12:36:52.057 回答
5

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

我将创建一个序列化为 xml 的优惠券类,然后加密 xml 字符串。验证将是解密字符串并查看它是否是有效的 xml(我建议不要反序列化对象而不先检查它)。

于 2008-10-13T12:34:40.080 回答
2

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

于 2008-10-13T12:30:55.050 回答
2

你的推销员(或女性)有多聪明?您可以仅对值进行 base 64 编码吗?

在此处查看如何进行 base64 编码和解码:

http://arcanecode.wordpress.com/2007/03/21/encoding-strings-to-base64-in-c/

除此之外,我会使用您和客户端应用程序已知的密钥来加密该值。

于 2008-10-13T12:33:32.580 回答
1

我猜你已经表达了你不想将代码存储在数据库中的问题(如果你这样做了,你可以简单地根据数据库验证每个代码)

因此,您可以做的是获取有关优惠券中内容的所有相关信息,然后将其与秘密盐一起散列以防止篡改。

因此,假设您想要一张价值 200 美元的用户 23 的优惠券,您可能会构建一个类似“23_200”的字符串,并使用“BillTheLizard”的秘密盐计算 MD5 哈希,得到 2671519131e974ee6fc746151e98f4a8,因此您给客户的完整代码是200_23_2671519131e974ee6fc746151e98f4a8

现在,当您收到代码时,将其拆分,并检查 md5("200_23"+secret) = 2671519131e974ee6fc746151e98f4a8 以验证值

编辑:如果 32 个字符的哈希值太长,您可以随时将其截断,例如将其切成 8 个字符仍然会给您 4294967296 个不同的哈希值。

于 2008-10-13T12:37:45.380 回答
1

这只是总结到目前为止的答案。生成此类优惠券代码有两种主要不同的方式:

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

  2. 去中心化解决方案:优惠券是一条独立的信息,可以在离线模式下验证,无需访问您的任何服务器。因此,优惠券代码必须包含部分(甚至全部)信息。最安全的方法是使用非对称加密或消息验证码,这样除了私钥持有者(您)之外,没有人可以生成优惠券。

于 2008-10-13T13:07:30.780 回答
1

Steve Gibson 在他的网站上谈到一次性密码,但没有理由不能使用它来创建一次性优惠券代码: http: //grc.com/ppp

于 2009-04-20T18:37:57.923 回答