绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
如何使用 python 制作一个简单的密码本
2023-07-04 17:14:38

不知道大家了解不了解暴力破解?我稍微解释下:

假如有个无聊的人用锁把我的电驴锁了,我并不知道与之匹配的钥匙长什么样,但是我有几乎无数把钥匙可以去试开这把锁。

这样看来,只有我肯浪费时间用一把把钥匙去开锁,那还是有机会打开的。

这种很笨很直接的方法叫做「暴力轮询」,如果用到一些解密的地方就叫做「暴力破解」了。

在暴力轮询中,拥有一本好的密码本是非常重要的。

「今天带大家用30行代码,写一个简单的密码本,如果能拿来破解一些rar、zip里小视频还是非常香的。」

开始

五位纯数字的密码,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

第四步,把密码本变成一个可迭代对象

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(, 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)

输出结果:

H3h%7(y*
3uF^tIG
A&)7UYe
5Q><
US;[*
p'$t
8b>
G'4
S0wBoRU+KW
#
bA}G'Qt;
.Q8#$bFz
o{J
RW6<F8c~X-
)~USp&&]
x
*
%$P^
tM^
9@6WBnu#t
VtL{1
7P5&2gqc/I
'F%@suk@_
reV
M$
P9O5Vayi#[
eg2O:'48
o
6iuday5e0
R3K%[)Er
CI3K^G
E58^Yt47
:8q8
9IeXxK$

一堆密密麻麻的乱码就在屏幕上飞奔。

我算了下这种情况坏的情况要试839299365868340次,才能试出正确密码。

后记

这个简易密码本不仅仅能用于密码破解,还能用于密码的生成、验证码的生成。

但是我觉得,本文让大家得到大的感受就是..以后密码还是设复杂点好,能用上特殊字符就用上特殊字符(哪怕一个),也会使暴力破解的成本变大好几倍。


分享好友

分享这个小栈给你的朋友们,一起进步吧。

Python
创建时间:2022-03-24 18:22:54
本小栈包含:Python基本教程 ,数据库基本教程,Python全栈,爬虫。以及Python的电子书分享等
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 崔浩月1
    栈主

小栈成员

查看更多
  • Will9041
  • LCR_
  • updownup
  • ASCII秋鹤
戳我,来吐槽~