将数据库ID混淆为面向客户的号码

时间:2013-11-19 12:24:56

标签: php mysql obfuscation

我正在使用mysql数据库自动增量作为订单ID。当我向用户显示订单ID时,我想以某种方式掩盖/混淆它。

为什么吗

  • 乍一看,管理员用户显而易见的是这个号码 指的是(订单从10开始,客户从20开始等)
  • 乍一看,这只是我的第四顺序。

基于此this answer,我希望屏蔽/模糊化的订单ID为:

  • 只是数字
  • 一致的长度(如果可能)
  • 不会导致碰撞
  • 是可逆的,所以我可以解码它并获得原始ID

我如何在PHP中实现这一点?它不一定非常复杂,乍一看它并不明显。

5 个答案:

答案 0 :(得分:8)

我认为您可以使用XOR运算符隐藏“乍一看”(例如MySQL):

(id*121) ^ 2342323

其中2342323121是“魔术”数字 - 订单号的模板。 扭转:

(OrderNum ^ 2342323)/121

在这种情况下的其他优势 - 如果(OrderNum ^ 2342323)除以121而没有余数,您可以验证OrderNumber(以避免垃圾邮件或在线表格中的类似内容)。

SQLFiddle demo

答案 1 :(得分:1)

有帮助吗?

echo hexdec(uniqid());

当然,您应该将此值存储在db,与订单ID相同的行。

答案 2 :(得分:1)

可能最简单的方法是生成一个长的随机字符串并使用它而不是自动增量ID。或者也可以将它与自动增量ID一起使用。如果字符串足够长且足够随机,则对于每个记录都是唯一的(考虑GUID)。然后,您可以向用户显示这些内容,而不必担心任何事情。

答案 3 :(得分:0)

将ID转换为类似HEX的内容可能无法为您提供所需的结果。此外,它仍然很容易'猜测'

我想要一个额外的ID列(即order_id)。设置一个unqi。指数。然后on_creation使用以下mysql函数之一:

SHA1(contcat('ORDER', id))
MD5(contcat('ORDER', id))
SHA1(contcat('ORDER', id, customer_id))
MD5(contcat('ORDER', id, customer_id))

UUID()

// try this in your mysql console
SELECT UUID(), SHA(CONCAT('ORDER',10)), SHA1(1);

您可以(如示例中)添加一个简单的文本前缀,例如“order”。甚至将它们结合起来。不过我觉得 UUID()最容易。

实现取决于您希望使用存储过程的内容或将其合并到模型中。

答案 4 :(得分:0)

有点晚了,但是擎天柱(TidyText)完全按照这里的要求行事。

$encoded = $optimus->encode(20); // 1535832388
$original = $optimus->decode(1535832388); // 20

只有初始设置有点奇怪(生成primenumbers)