描述:
比如像邀请码那样,但是怕暴力猜解。
所以需要像充值卡一样,有序列号和密码的。
不知道大家能否提供一些有效的思路~最好是安全系数高一点~
感谢~
补充下,如果需要序列号最好同时出现数字和密码呢?
解决方案1:
任何一种单向/双向加密算法都可以,自己保存密钥
解决方案2:随机数组转二进制转8进制转十六进制,中间加一些盐值
解决方案3:很多时候处理ID都有点象1楼那样,但是为了很直观的知道订单是哪一天的,所以我们还是会在订单中间加入年月日,比如生成310101000020120903(后面可以是秒也可以忽略)000001之类的订单
前10位的前6位,其实是地区信息,当然建议以后需要混淆处理一下,这样通过程序查看订单时,可以很快的知道,订单是哪个地区的用户,什么时候下的单子(这时候客服都可以不用打开后台的订单管理程序,而直接根据订单号来辨别)
当然也可以在最后一位用一个校验码,类似于身份证那样的,这样即使别人乱改订单号,你也可以通过校验码来进行校验。
解决方案4:像充值卡这种,建议 GUID + UUID ,安全性首要考虑;
订单号这种,根据数据库的物理ID来生成,规则自定;只要达到隐藏业务信息的目的即可。
$year_code = array('A','B','C','D','E','F','G','H','I','J'); $order_sn = $year_code[intval(date('Y'))-2011]. strtoupper(dechex(date('m'))).date('d'). substr(time(),-5).substr(microtime(),2,5).sprintf('%02d',rand(0,99)); return $order_sn;
目前用于生成订单号。。
解决方案6:没有做过此类应用的经验,从同事那得知的做法是在有序的ID前后加入定长的随机串即可。
详解:
1. 假设有A和B两个序列号,它们在数据库对应的ID分别为1和2
2. 将ID补齐到定长,如10位,即000000001和0000000002
3. 在前后加入随机串并保存以便验证,如前后各4位,即854600000000012495和814600000000021738
验证过程就简单了,substr($sn, 4, -4)取出ID,到数据库查询对应的前后缀,比对即可。有密码的其实就多存了下密码罢了。
实际使用中根据业务情况以及安全性考虑可能有所差别吧。