公共代码:python
#!/usr/bin/env python # -*- encoding:utf-8 -*- import hashlib user= "12345" now = 1388653051.12 def md5( s ): m = hashlib.md5() m.update(s) return m.hexdigest()
若是咱们要对某个账号生成校验码和生成时间,通常的方案是:dom
s = md5(user + str(now)) s+= "." + str(now) print s #9789526c5db4b97a5a41824ba91ec1f2.1388653051.12
而后咱们就会发现,当对前面的32位进行反查md5的时候很容易获得原始的 "12345"
因而咱们继续混淆,把时间先md5一下而后再整体md5code
now_md5_hex = md5((str(now))) s = md5(user + now_md5_hex) s+="." + str(now) print s #5e31cc8cac2e1d3e33e6a8637fa76115.1388653051.12
反查仍是有点简单,咱们决定对时间的md5值进行取样,取前4位(固然也能够取1,3,5,7位)md5
now_md5_hex = md5((str(now))) s = md5(user + now_md5_hex[0:4]) s+="." + str(now) print s #a658d7fddaf0d4f49551837b476c5269.1388653051.12
通常人的方案到这里就结束了,若是有增强,可能不是取前4位而已,取的是[1,3,4,7]这样的位,无论怎样,取多少位都是写死在程序里的。若是你说引入第三个变量,效果是同样的..由于时间这个变量是要给客户端的...utf-8
因而咱们想,时间戳还有没有其它利用价值,好吧,原来时间也是数字,咱们根据时间每一个位每一个字符,因而诞生了以下的想法:hash
s = md5(user) now_str = str(int(now)) rnd = [s[int(i)] for i in now_str] s = md5(s + ("".join(rnd))) s+="." + str(now) print s #c3827f2499d5794d2b2071b7be7c890b.1388653051.12
感受这样仍是有点容易了,想了想,时间还有什么做用,时间线性同余随机数,很少解释,上代码了:import
import random rdm = random.Random() rdm.seed(now) s = md5(user) rnd = [str(rdm.randint(1,100)) for i in range(0,4)] s = md5(s + ("".join(rnd))) s+="." + str(now) print s #89fa3b1dfdd624357320f5496a7cb07c.1388653051.12
好了...到这里已经有点难度了把... 若是前面四种进行随机组合和叠加,那就更难破解了...变量