我正在使用一个系统来销售比赛的门票。
当前工单id号是连续的。例如: 651,652,653。如果有人要买一张新票,他的票id将是654。
我正在寻找一种解决方案,通过向用户发送字符串而不是票号来通知用户他的门票唯一id,这样他就可以有一个参考,但他不会知道以前购买了多少门票。
通过加密票号651,我想生成一个最多6-7个字符的字符串,全部大写,该算法应该是双向的,并且只使用密钥进行反向。使用像881hu这样的密钥和651这样的加密码,我应该可以得到像UTR8N1A0这样的东西。
为了可读性,我需要大写字母,并且新字符串的长度不应该太长,因为那样会很难记住。
我有这样的算法选择吗?我使用PHP作为服务器语言来完成这一切。
发布于 2014-02-27 22:44:47
我同意@RaggaMuffin-420评论,这样你最多可以有6-7个大写字符。对于像mcrypt这样的东西,没有简单的方法可以用6-7个字符来完成它……当然,如果你不想做一些愚蠢的事情,比如:
$secret = 123456789;
$tickedID = 654;
$code = strtoupper( dechex($secret + $tickedID) );
echo 'Code is: ' . $code . '<br>';
$decode = hexdec($code) - $secret;
echo 'Decoded: ' . $decode;输出:
Code is: 75BCFA3
Decoded: 654免责声明:我同意在数据库中添加唯一的代码来引用实际的标记id。
发布于 2014-02-27 23:31:49
一种选择--你可以计算一个散列(consecutive_number+ salt),然后对散列进行编码。
更新:如果您需要快速提取原始consecutive_number,请将其隐藏在编码的散列字符串中。您可以读取它,并可以通过重新计算散列来验证它(因为盐是秘密的,所以不能轻松地计算散列来构造有效的密钥)。
发布于 2017-12-29 04:07:26
互联网上有很多糟糕的建议(还有像“hashids”这样的糟糕设计),但最终你想要的是:
不要这样做:

改为执行以下操作:

图片(和详细的参数)来自:The Comprehensive Guide to URL Parameter Encryption in PHP
https://stackoverflow.com/questions/22071516
复制相似问题