因此,我需要生成一个代码,该代码可以绑定到特定用户/潜在客户,其中包含一定金额。它需要是可逆的,以便客户端应用程序可以确认代码的有效性并应用经理打算的折扣。
我想让代码尽可能短,但需要对其进行很好的混淆,以便销售人员不能自己开始搞乱它。
我可以拿出一些东西自己弹跳数字,除以pi并转换为十六进制等等但我真的对社区的想法或最佳实践感兴趣。
我在C#中这样做,但我希望可以翻译任何语言的方法。
编辑: 澄清。我不能提前存储这些东西,代码必须在运行中构建并随身携带所有信息。
例如。推销员14打电话给客户773,并希望给他们500美元的订单。 14,773和500必须在优惠券代码中,并且能够在销售员密钥输入后在客户端应用中提取。
答案 0 :(得分:7)
生成用于签名的公钥/私钥对。使用私钥对用户ID和优惠券价值的组合进行数字签名。将优惠券价值+签名发布为优惠券代码,例如使用字母和数字进行编码。客户端应用程序将通过重新创建最初签名的数据组合(例如,将用户ID添加到优惠券值)然后验证数字签名来验证代码。
答案 1 :(得分:5)
听起来像是不对称加密的情况。你可以向所有人公开公钥,从而为他们提供验证优惠券的信息,但创建一个杯子的能力将取决于私钥的所有者(=你)。
我会创建一个序列化为xml的优惠券类,然后加密xml字符串。验证是解密字符串并查看它是否有效xml(我建议不要在不检查之前反序列化对象)。
答案 2 :(得分:2)
我会使用客户代码和优惠券到期日期。至于验证,您只需在您的数据库中存储有效的优惠券并验证。您可以每天扫描一次优惠券表以清除过期的代码。
答案 3 :(得分:2)
您的推销员(或女性)有多聪明?你可以只对64进行编码吗?
点击此处查看base64编码和解码的方法:
http://arcanecode.wordpress.com/2007/03/21/encoding-strings-to-base64-in-c/
除此之外,我会使用您和客户端应用程序已知的密钥加密该值。
答案 4 :(得分:1)
我猜测你已经表达了你不想将代码存储在数据库中的问题(如果你这样做,你可以简单地根据数据库验证每个代码)
所以,你可以做的是获取有关优惠券内容的所有相关信息,然后将其与秘密盐一起散列以防止篡改。
因此,假设您想要一个价值200美元的用户23的优惠券,您可能会建立一个类似“23_200”的字符串,并使用“BillTheLizard”的秘密盐计算MD5哈希值得到2671519131e974ee6fc746151e98f4a8,因此您提供的完整代码客户是200_23_2671519131e974ee6fc746151e98f4a8
现在,当您收到代码时,将其分开,并检查md5(“200_23”+ secret)= 2671519131e974ee6fc746151e98f4a8以验证值
编辑:如果32个字符的哈希太长,您可以随时截断它,例如将它砍成8个字符仍然会给你4294967296个不同的哈希值。
答案 5 :(得分:1)
这只是为了总结答案到目前为止。生成此类优惠券代码有两种主要的不同方式:
集中解决方案:每张优惠券的相关信息都存储在您的数据库中。优惠券代码可以随机生成并简短 - 它只是对数据库中包含所有必要信息的记录的引用,例如优惠券价值,客户ID,代表ID。验证此类代码需要在线访问您的服务器。
分散式解决方案:优惠券是一种独立的信息,可以在离线模式下验证,无需访问任何服务器。结果,优惠券代码必须包含一些(甚至全部)信息。最安全的方法是使用非对称加密或Message Authentication Code,以便除了私钥(你)的持有者之外的任何人都可以生成优惠券。
答案 6 :(得分:1)
史蒂夫·吉布森在他的网站上谈到一次性密码,但没有理由不使用它来创建一次性优惠券代码:http://grc.com/ppp