如何使用实际订单ID生成唯一订单ID(仅显示touser)?

Gau*_*rav 7 php c encryption algorithm

再次编辑:我不想再创建另一个问题,所以问这里.我有同样的情况.但是这次我需要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 ;
Run Code Online (Sandbox Code Playgroud)

我想生成一个唯一的订单ID,(仅向用户显示),以便用户无法猜测下一个订单ID.

如何从原始订单中获取该唯一随机订单ID

并从该随机订单ID获取原始订单ID?

编辑:我不想创建任何其他字段.

bia*_*ron 9

  1. 创建您的密钥(任何字符串)并保存在配置文件(或DB配置)中.
  2. 创建唯一ID : $newId = hash_hmac('sha1', $orderId, $secret_key).'-'.$orderId;. 所以,您的订单页面看起来像http://example.com/order/show/123456...absdef-123.
  3. 您可以快速获取原始订单ID并进行检查:
 list($hash, $original) = explode($newId, '-', 2);
 if (hash_hmac('sha1', $original, $secret_key).'-'.$original === $hash)
 {
    // its a correct ID
 }
 else
 {
    // wrong hash, ignore it!
 }
Run Code Online (Sandbox Code Playgroud)

这样原始ID是公共的,但由于未知的散列字符串(唯一ID的第一部分),用户无法在站点地址中替换它.

  • +1用于使用HMAC,以便即使用户猜测下一个orderId**和**哈希方法,他/她也不能生成不透明代码并伪装另一个orderId的请求.很好的答案. (4认同)

Sha*_*ady 9

如果您的要求是:

  • 它必须是可逆的(即给出"随机"ID,你可以找到原始的order_id)
  • 没有额外的列
  • 您根本不想向用户显示原始/内部order_id

然后我会推荐某种双向加密.哈希不会起作用,因为您无法从哈希中找到原始值.

我还补充说它应该是人性化的,例如有人可以通过电话给你打电话

我将使用位于一个非常简单的双向加密类在这里,这是写由托尼·马斯顿.

我们希望解决方案是人性化的,所以让我们删除一些争夺字符.我只留下大写字母,数字以及空格和短划线符号.所有这些都可以使用标准的语音字母轻松传达,强制使用大写可以消除任何关于角色是什么的混淆.

这些是我使用的争夺字符串(我使用这个在线单词扰码器,而不是试图自己扰乱字符串):

    $this->scramble1 = '0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ ';
    $this->scramble2 = 'UKAH652LMOQ FBDIEG03JT17N4C89XPV-WRSYZ';
Run Code Online (Sandbox Code Playgroud)

因此,创建我们的人性化订单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;

?>
Run Code Online (Sandbox Code Playgroud)

(您需要在本地下载并保存*encryption_class*文件,并将其包含在内).

我从命令行运行该代码并收到以下输出:

Original: 123456789
Encrypted: 2UD5UIK9S
Decrypted: 123456789
Run Code Online (Sandbox Code Playgroud)

现在,我们有我们的短,人性化的order_id,它可以在一个URL,例如使用http://myapp.example.com/order/view/2UD5UIK9S,你永远需要显示或通信的内部ORDER_ID给用户.

笔记:

一旦您的order_id是唯一的,加密代码将是唯一的(因为它将是PK)

这不应该用作密码加密/解密例程 - 不存储密码,存储哈希值.

确保您的密钥是随机的,复杂的,并且包含$ scramble变量中的字符.

它仅对order_id进行模糊处理.

编辑:

虽然填充输入字符串(ORDER_ID)产生一定量的ramdomness的,你可以用@ biakaveron的回答结合它创建类似URL http://myapp.example.com/order/view/5cc46aea44e898c3b4e1303eb18d8161302cd367/2UD5UIK9S