我正在使用系统销售游戏门票。
故障单的当前ID号是连续的。 EG:651,652,653。如果有人会买新票,他的票号是654。
我正在寻找一个解决方案,通过向他发送一个字符串而不是票号来告知用户他的票证唯一ID,以便他可以有参考,但他不知道之前购买了多少票。 / p>
通过加密票号651我想生成一个最大为6-7个字符的字符串,全部为大写,并且该算法应该是双向的,并且只能使用密钥进行反转。 EG:使用像881hu这样的密钥并加密数字651我应该得到像UTR8N1A0这样的东西。
我想要大写字母以便于阅读,新字符串的长度不应太长,因为这样很难记住。
我有这种算法的选择吗?我正在使用PHP作为服务器语言。
答案 0 :(得分:0)
我同意@ 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中。
答案 1 :(得分:0)
一个选项 - 您可以计算散列(consecutive_number + salt)然后对散列进行编码。
更新:如果您需要快速提取原始的连续编号,请将其隐藏在编码的哈希字符串中。您可以阅读它,并且可以通过重新计算哈希来验证它(因为盐是秘密的,人们将无法轻松计算哈希来构造有效密钥)。
答案 2 :(得分:0)
互联网上出现了很多糟糕的建议(以及像#34; hashids&#34;这样的糟糕设计),但最终你想要的是:
来自The Comprehensive Guide to URL Parameter Encryption in PHP
的图像(和详细参数)