假如有个无聊的人用锁把我的电驴锁了,我并不知道与之匹配的钥匙长什么样,但是我有几乎无数把钥匙可以去试开这把锁。
这样看来,只有我肯浪费时间用一把把钥匙去开锁,那还是有机会打开的。
这种很笨很直接的方法叫做「暴力轮询」,如果用到一些解密的地方就叫做「暴力破解」了。
在暴力轮询中,拥有一本好的密码本是非常重要的。
「今天带大家用30行代码,写一个简单的密码本,如果能拿来破解一些rar、zip里小视频还是非常香的。」
class PasswordBook:
small_character = "abcdefghijklmnopqrstuvwxyz"
big_character = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
number = "0123456789"
special_sign = "~!@#$%^&*()_+|}{[]';,./<>:=-"
def __init__(self, min_len, max_len, model):
self.model = model
if min_len < max_len:
self.min_len = min_len
self.max_len = max_len
else:
self.min_len = max_len
self.max_len = min_len
def __iter__(self):
return self
五位纯数字的密码,1~100000有100000种可能;
如果数字加上小写字母,则有60466176种可能;
如果把大写字母也带上,916132832种可能,
如果再把特殊字符带上,那就......
如果能在“暴力破解”之前知道密码的位数,哪怕一个区间也是非常有用的。
class PasswordBook:
def __init__(self, min_len, max_len):
if min_len < max_len:
self.min_len = min_len
self.max_len = max_len
else:
self.min_len = max_len
self.max_len = min_len
在__init__方法中,设定模式:
model = 1 纯数字密码本,
model = 2 数字带字母密码本,
model = 3 数字带字母再带特殊字符密码本。
class PasswordBook:
small_character = "abcdefghijklmnopqrstuvwxyz"
big_character = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
number = "0123456789"
special_sign = "~!@#$%^&*()_+|}{[]';,./<>:=-"
def __init__(self, min_len, max_len, model):
self.model = model
if min_len < max_len:
self.min_len = min_len
self.max_len = max_len
else:
self.min_len = max_len
self.max_len = min_len
def __iter__(self):
return self
这一步非常重要,需要把模式(model)的判断,密码的生成都写到__next__方法中,配合random模块将随机输出符合规则的密码:
import random
class PasswordBook:
small_character = "abcdefghijklmnopqrstuvwxyz"
big_character = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
number = "0123456789"
special_sign = "~!@#$%^&*()_+|}{[]';,./<>:=-"
def __init__(self, min_len, max_len, model):
self.model = model
if min_len < max_len:
self.min_len = min_len
self.max_len = max_len
else:
self.min_len = max_len
self.max_len = min_len
def __iter__(self):
return self
def __next__(self):
result_word = ''
# 判断模式
if model == 1:
words = self.number
elif model == 2:
words = self.number+self.small_character+self.big_character
else:
words = self.number+self.small_character+self.big_character+self.special_sign
# 随机迭代输出符合要求的密码
for i in range(0, random.randint(self.min_len, self.max_len)):
result_word += random.choice(words)
return result_word
测试输出下,假装我有个10位数,密码字符组成不详(使用数字、字母、特殊字符组合的model3吧):
for pwd in PasswordBook(1,10,model=3):
print(pwd)
输出结果:
一堆密密麻麻的乱码就在屏幕上飞奔。
我算了下这种情况最坏的情况要试839299365868340次,才能试出正确密码。
这个简易密码本不仅仅能用于密码破解,还能用于密码的生成、验证码的生成。
但是我觉得,本文让大家得到最大的感受就是..以后密码还是设复杂点好,能用上特殊字符就用上特殊字符(哪怕一个),也会使暴力破解的成本变大好几倍。