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

pau*_*aul 3 php mysql obfuscation

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

为什么?

  • 所以乍一看,管理员用户显而易见的是这个数字所指的是什么(订单从10开始,客户从20开始等)
  • 乍一看,这只是我的第四顺序.

基于这个答案,我希望屏蔽/混淆的订单ID为:

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

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

val*_*lex 8

我认为你可以使用XOR运算符隐藏"乍一看"(MySQL示例):

(id*121) ^ 2342323
Run Code Online (Sandbox Code Playgroud)

哪里2342323121是"魔术"数字 - 订单号的模板.扭转:

(OrderNum ^ 2342323)/121
Run Code Online (Sandbox Code Playgroud)

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

SQLFiddle演示


Vil*_*lx- 1

也许最简单的方法是生成一个长随机字符串并使用它而不是自动递增 ID。或者可以将其与自动增量 ID 一起使用。如果字符串足够长且足够随机,则对于每个记录来说它都是唯一的(想想 GUID)。然后你就可以将这些显示给用户而不用担心任何事情。