【废话】
首先声明,我在密码学方面并无任何造诣,对各种理论知之甚少。如果贴中出现错误之处,还请各位高手热心指正。
divinger的帖子:
http://bbs.pediy.com/showthread.php?t=113782
我是今天才看到此贴的。
我的确没想到divinger竟然成功的攻击了此类充值系统。 我查阅了部分互联网资料加上自己的理解便有了下文。
【充值系统猜想】
这里我就以一般的手机充值卡作为例子。比如中国移动的充值卡,它有一一个序列号。这个是可见的。然后还有一个密码,这个是被涂层所覆盖的。序列号就相当于卡的ID了,对我们来说没什么用。我们充值时,只需刮开涂层,然后拨打一个充值电话13800138000,按提示输入密码即可充值成功。
上面介绍的是充值方法。现在假如我是中国移动,我该怎么保证这种机制的安全性了?
(保证安全性说白了就是防止他人在无卡的情况下通过多次尝试而成功充值)
1。充值的手机号码必须是已经开通的中国移动号码。
拨打充值电话时,语音提示最后会询问并确认你要充值的手机号码。
服务中心会从数据库中查询此号码是否合法。不合法直接return false。
2。密码序列的有效性。
(从效率方面来看,本来应该是先检验有效性,然后在数据中查询号码是否合法的,但服务中心的机器肯定不是一般的机器,我想应该会是大机之类的重量级东西,所以这点效率它可以忽略)
密码序列怎样才算有效?
和网络数据包的包尾CRC校验类似,密码序列中肯定包括数据校验位,说白了,就是密码序列的各部分必须满足一个算法。然后这里的算法会尽可能让你猜测不出来,比如是否是通过设置校验位来检验数据有效性,校验位数据处于密码序列的哪一部分,长度几何等。
3。密码序列产生的随机性!
这一点是最关键的地方。
大家想,中国移动要卖充值卡,它首先要制作一批充值卡,大家再想全国该有多少个充值卡销售点,所以这批充值卡的数量是十分巨大的。
因为在制作每张充值卡的时候,密码是需要印刷上去的。所以,无时无刻,中心服务器中可用的有效密码的数量也是十分巨大的!
虽然数量巨大,但如果你把它当成一个数字,它还是很小的。比如拿它和40亿比,还是显得很小。
不管怎样,移动公司为了防止有人从已有的数据中找出规律,最大可能地预测出它服务器中保存的有效密码,它必须选择一个好的密码生成算法。
【关于随机性】
0。计算机产生的随机都是伪随机,因为计算机本身就是一个确定性的系统。随机序列取决于种子和随机算法。比如我们常用的srand和rand。
srand的种子在32位机器上有4G的范围。crt库的rand算法固定。所以也就40多亿个序列。超过这个周期就必然会有重复。
1。序列元素的随机性。
比如最常用的,我要生成一个随机字符串。我一般会这么做:
a。设置一个种子。
b。使用线性同余的方法,得到一个序列。
srand(time)
for i = 0 至 len
rand() % 26
2。序列的随机性
还是比如要生成一个随机字符串,如果使用下面的代码:
for i = 0 至 len
srand(time)
rand() % 26
那么得到的很可能是一个类似“xxxxxx”的字符串。
说到这里,我想明白的早都明白了,不明白的可以自己思考。 我要说的也即:在使用随机的时候,一定要明确你需要的是元素的随机还是序列的随机,其实序列的随机也就是种子的随机。 因为一个种子对应一个序列。
【充值卡的随机选择】(猜想)
*纯属猜想*
返回到充值卡这里,充值卡的密码我猜是分批次生成的,比如这一批要生成N张,那么设置一个种子,然后之后生成的每个密码都是该种子所对
应序列的一个元素。我为什么会这样猜想了,因为如果对每一个密码的生成都设置一个种子。那么你还得考虑种子的随机性。而且有一点需要
注意,如果在生成每个密码的过程中,没有人为的干预控制的话,计算机硬件环境的变化会很小(如果生成时间不长的话)或者变化是有一定规律的。
对于一批密码的生成,每个密码的生成是否是公用一个种子,我70%倾向于是。
对于一个密码的生成,每个字符的生成是否是公用一个种子,我95%倾向于是。
【充值卡随机性攻击猜想】(纯属猜想)
1。统计数据源获取。
获得大量的密码数据, 突然隐约记起来以前有人低价收购过废弃充值卡的。根据大量数据运用统计学方法分析。
2。关键点数据的取得。
这里就转到divinger所说的日本的WebMoney公司。假如我想知道连续几个密码是多少。我该怎么办了?
我可能会选择在夜深人静的时候,日本网民都睡觉了的时候,去他们网站连续购买几张充值卡以确保连续性。但同时我还得祈祷,服务器在
售卡的时候的确是顺序的从数据库取数据,且该批次生成的密码是按顺序放到数据库中的。(这个概念就很低了)
3。保证攻击密码的校验性。
4。无线电发射电磁波--根据服务中心应答情况(速度,时间等等症状)优化攻击密码生成策略--大功率发射,直到碰撞成功。
(这个就纯属YY了,呵呵~ 大家一笑而过吧~~)
【关于divinger所提到的哲学】
攻击者需要具备的基本哲学素养:
第一 这个世界上本没有路,只是走的人多了也便有了路
第二 科学没有国界,但是科学家有自己的祖国
第三 世界上没有完全相同的两片叶子
对应以上基本哲学常识,攻击者需要的哲学思考是:
第一 没有人走过并不表示那不是路
第二 任何学科都是人为划分的,现代人的创新能力低下,大多源于此
第三 世界上肯定有完全相同的两个序列号类似于 1=1 这个简单的等式两边的1是完全相同的一样
我妄加猜测了一下, 若有不对之处,还请divinger指出:
1,2两点无外乎是强调创新能力和思维的大胆性。 第3点可能说的是计算机不可能制造出真正的随机,伪随机始终会有一个重复周期。
其实我也认为哲学很重要,去年9月份还请教过伊万前辈,请求推荐几本书籍。不过我当时的目的并不是为了去升华自己的计算机知识,因为我
还没达到那个境界,我只是觉得生活的方向思维的习惯需要哲学去指引。只是感觉是这样,也不知道对错。
【关于divinger的声波逆向理论】
R大去搜索这个理论,肯定是搜索不到的。这只是divinger为他的算法随便起的一个名字。
自从技术与利益挂钩了,很多东西自然是不会被共享出来的,真正的技术始终都是不公开的。这个我深有体会。当来到一个新环境,可能你之
前半年都没解决的问题,别人无私的指点你几句,你就明白了,同时你会发现,怎么互联网上讨论这个问题这么多就是没看到个像样的答案或者解决方案了, 因为--不公开的技术才是真正厉害的技术。
【后记】
写了这么多, 其实也没什么东西。。。 关键的随机性攻击这里,也没讲多少。。 因为本人水平有限。
至于divinger的非线性碰撞和声波逆向理论, 我也不大明白。 期待他的文章。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课