今天是2015年4月24日 深圳阴
有十天没有写日志了。
这几天解决了一个之前困扰我久的问题
在实际的开发中一个问题解决与巧妙的解决有着很大的不同
实际的场景:
我们的用户会公开一个简历页面,这个页面会跟随用户的标识Id,是一个长整型的数字
这个规则很简单,如果有人恶意要去遍历这个数字Id,哪么所有的用户简历都可以轻松拿到,这不是我们希望看到的局面
哪么如何解决这个问题:
1.给用户这个id加密
2.给用户生成一个随机的字符串
3.给用户产生一个GUID
首选给Id加密是我们第一个想到的办法,一开始我们想到用 AES 加密
AEC 加密时需要一个加密Key,同时数字Id要转成String类型,
Key的长度最少为16位 byte
这样加密出来的数据会显得很长, 一大串的字符,而且加密Key要妥善保管,
看起来这样实现有一些复杂,我们想用一种更轻的方法
接下来我们考虑了第2种与第3种,这两种原理都是一样。在创建用户时产生一个随机的串
使用GUID可以保证不会重复,使用自己写的随机算法可能会重复。但实际也可以避免,
这样结果是数据库多了一个字段。同时也要为这个字段做一个索引,理论上字符串的索引速度是没有数字索引速度快
而且程序实体类里输入输出都要增加一个字段。
我们不希望把工作搞这么复杂
哪么我们还是希望能过算法支解决这些问题
看看我们的id 是这样的
1,2,3,4,5,6,7,8,9,10
我们只是不想让别人遍历,也可以说就算他能遍历要增加他们难度
我们想到了使用园的面积公式
S=πr²
把数字Id当成圆的半径
经过计算后我们的数字已经变成一个面积值
就如同上图的周边的气体一样
3.1415926 12.5663704 28.2743334 ....
这样的数字无法遍历,
这样的数学公式在实际的开发中能够很巧妙的解决问题。
今天就写到这里。谢谢!