当前位置:  开发笔记 > 前端 > 正文

隐藏/加密订单号作为另一个数字:对称,"随机"外观?

如何解决《隐藏/加密订单号作为另一个数字:对称,"随机"外观?》经验,为你挑选了3个好方法。

客户有一个简单的增加订单号(1,2,3 ......).他希望最终用户收到8位或9位数字(仅数字 - 无字符)"随机"数字.显然,这个"随机"数字实际上必须是唯一且可逆的(它实际上是对actualOrderNumber的加密).

我的第一个想法是只是洗牌一些.当我向客户展示一个样本序列时,他抱怨随后的obfuscOrderNumbers正在增加,直到它们达到"shuffle"点(低位比特发挥作用的点).他希望obfuscOrderNumbers尽可能随机看似.

我的下一个想法是确定性地播种线性同余伪随机数生成器,然后获取actualOrderNumber值.但在这种情况下,我需要担心碰撞 - 客户想要一种保证不会在至少10 ^ 7个周期内发生碰撞的算法.

我的第三个想法是"呃,只是对加密的东西进行加密",但如果我使用股票加密库,我必须对其进行后期处理才能获得8位或9位数的要求.

我的第四个想法是将actualOrderNumber的位解释为格雷编码的整数并返回.

我的第五个问题是:"我可能会过度思考这个问题.我敢打赌,StackOverflow上的某个人可以用几行代码完成这项工作."



1> Pesto..:

随机选择一个8位或9位数字,比如839712541.然后,取你的订单号的二进制表示(对于这个例子,我没有使用2的补码),将其填充到相同的位数(30),反转它,和xor翻转的订单号和幻数.例如:

1         = 000000000000000000000000000001

Flip      = 100000000000000000000000000000
839712541 = 110010000011001111111100011101
XOR       = 010010000011001111111100011101 = 302841629

2         = 000000000000000000000000000010

Flip      = 010000000000000000000000000000
839712541 = 110010000011001111111100011101
XOR       = 100010000011001111111100011101 = 571277085

要获取订单号,请输出带有幻数的输出数,转换为位串,然后反转.



2> Brian Knobla..:

哈希函数? http://www.partow.net/programming/hashfunctions/index.html


哈希函数不可逆!!

3> vladr..:

客户是否需要分配模糊的连续订单号以使其看起来像什么?

如果您不想使用加密复杂化,请使用位混洗和一些随机salting的组合(如果您有多余的位/数字)XOR叠加在一些固定常量(或某些功能很容易的东西上)随时可以使用模糊的订单ID,例如可能是customer_id谁下了订单?)


编辑

似乎所有客户的愿望都是外部方无法推断销售进度.在这种情况下,改组解决方案(比特映射,例如原始比特1映射到模糊比特6,原始比特6映射到模糊比特3等)应该是绰绰有余的.如果您真的想要使其更难破解,请添加一些随机位,前提是您有额外的位可用(例如,假设原始订单号最多只能达到6位数,但在混淆的订单号中允许8-9,然后你可以在执行位映射之前使用2-3位数字进行随机性处理.可能会对结果进行XOR以进行额外的恐吓(一个好奇的一方可能会尝试生成两个连续的混淆命令,将它们相互异或,以消除XOR常数,


EDIT2

当然,您可以为混淆的订单ID分配完全随机的数字,将对应关系存储到持久存储(例如DB),并执行冲突检测以及针对相同存储的去混淆.矫枉过正的一点,如果你问我,但加方是最好尽可能模糊变(和你实现取其分布函数,你的灵魂渴望,并且可以更改分布函数任何时候你喜欢.)

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有