再次编辑:我不想创建另一个问题,所以在这里提问。 我有同样的情况。但是这次我需要使用C语言的算法。有谁能够帮我。
我有下表。
CREATE TABLE IF NOT EXISTS `j741_order` ( `order_id` int(11) NOT NULL AUTO_INCREMENT, `buyer_id` int(11) NOT NULL, `subtotal` decimal(15,5) DEFAULT '0.00000', `discount` decimal(15,5) NOT NULL DEFAULT '0.00000', `shipping` decimal(15,5) DEFAULT '0.00000', `tax` decimal(15,5) DEFAULT '0.00000', `total` decimal(15,5) NOT NULL DEFAULT '0.00000', `currency` char(3) DEFAULT NULL, `status` int(11) NOT NULL DEFAULT '0', `created_date` datetime NOT NULL, `modified_date` datetime NOT NULL, PRIMARY KEY (`order_id`), KEY `idx_buyer_id` (`buyer_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
我想生成一个唯一的订单ID(仅向用户显示),以便用户无法猜测下一个订单ID。
如何从原始订单中获取唯一随机订单ID,如果 并从该随机订单ID中获取原始订单ID?
如何从原始订单中获取唯一随机订单ID,如果
并从该随机订单ID中获取原始订单ID?
编辑: 我不想创建任何其他字段。
如果您的要求是:
那么我会建议某种双向加密。散列无法正常工作,因为您无法从散列中找到原始值。
我还要补充一点,它应该对人类友好,例如有人可以通过电话将其呼唤给您
我将使用一个位于此处的非常简单的双向加密类,该类由Tony Marston编写。
我们希望该解决方案对人类友好,因此让我们删除一些混乱字符。我只剩下大写字母,数字,空格和破折号。使用标准的语音字母可以很容易地传达所有这些信息,并且大写字母的强制使用消除了关于字符是什么的任何混淆。
这些是我使用的加扰字符串(我使用此在线单词加扰器,而不是自己尝试加扰字符串):
$this->scramble1 = '0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ '; $this->scramble2 = 'UKAH652LMOQ FBDIEG03JT17N4C89XPV-WRSYZ';
因此,创建我们人类友好的订单ID的代码为:
<?php include 'encryption_class.php'; $crypt = new encryption_class(); $key = "A-COMPLETELY-RANDOM-KEY-THAT-I-HAVE-USED"; // Min length of 8 for encrypted string $min_length = 8; $order_id = 123456789; print "Original: " . $order_id . PHP_EOL; $encrypt_result = $crypt->encrypt($key, $order_id, $min_length); print "Encrypted: " . $encrypt_result . PHP_EOL; // DECRYPT $decrypt_result = $crypt->decrypt($key, $encrypt_result); print "Decrypted: " . $decrypt_result . PHP_EOL; ?>
(您需要下载 encryption_class 文件在本地并将其包含在内)。
我从命令行运行了该代码,并收到以下输出:
Original: 123456789 Encrypted: 2UD5UIK9S Decrypted: 123456789
现在,我们有了一个简短的,对人类友好的order_id,可以在诸如http://myapp.example.com/order/view/2UD5UIK9S之类的URL中使用它,而您无需将内部的order_id显示或传达给用户。
笔记:
一旦您的order_id是唯一的,加密的代码就会是唯一的(因为它是PK,所以会是唯一的)
不应将其用作密码加密/解密例程-不要存储密码,存储哈希。
确保您的密钥是随机的,复杂的,并且 仅 包含$ scramble变量中的字符。
它仅混淆order_id。
编辑:
尽管对输入字符串(order_id)进行填充会产生一定程度的随机性,但您可以将其与@biakaveron的答案结合起来以创建类似http://myapp.example.com/order/view/5cc46aea44e898c3b4e1303eb18d8161302cd367/2UD5UIK9S的URL