python3 生成密码字典
黑客破解密码通常会用到密码字典^[密码字典,是配合密码破译软件所使用的。密码字典里包括许多人们习惯性设置的密码,这样可以提高密码破译软件的密码破译成功率和命中率,缩短密码破译的时间。—— 密码字典],网上会看到各种各样的密码生成器,那么本文就一起用 python3 实现一个简单的密码生成器吧,就叫它 keykey 吧!
本文实现的密码生成器,非常简单和暴力,其实就是穷举^[Python - 自导自演 密码字典暴力破解],哈哈哈!
知识点
- itertools,是 python 内建库,提供了很多操作迭代对象的函数接口,本文生成密码主要用到的就是
product
方法。 - argparse,这是用于解析命令参数的库,python 内建的,argparse 库的使用 介绍了基本使用方法,可以了解下。
实现
因为暴力生成密码是很简单的操作,所以只需跟着十里操作就明白怎么实现了。
准备工作
本文实现使用的都是 python3 内建库,所以不需要安装第三方库。
-
新建脚本文件
keykey
:touch keykey
-
赋予文件运行权限:
chmod +x keykey
-
为脚本文件注明python解释器,文件中添加内容:
#!/usr/bin/env python3
-
导入需要用到的库,文件中:
import os import argparse import itertools
生成密码列表
下一步实现密码列表生成的方法 getkeyslist
,文件中添加以下代码:
def getkeyslist(minlength, maxlength, choices='0123456789'):
"""生成 minlength ~ maxlength 位密码列表,并返回列表
Args:
minlength: 密码最小位数
maxlength: 密码最大位数
choices: 候选字符,密码使用的字符从候选字符中得到
Returns:
keyslist: 密码列表
"""
if choices is None:
choices = '0123456789'
keyslist = []
for i in range(minlength, maxlength + 1):
keyiter = itertools.product(choices, repeat=i)
keys = [''.join(c)+'\n' for c in keyiter]
keyslist.append(keys)
print(f'[+] 已生成 {minlength} ~ {maxlength} 位密码字典 [+]')
return keyslist
其中:
-
itertools.product(choices, repeat=i)
生成一个迭代器,迭代器每次迭代会从choices
中提取字符组成包含i
个字符的 tuple ,每个 tuple 中的元素为单个字符,如下的样子,迭代器会枚举所有可能的i
个字符组合。('0', '1', '2', '3')
-
[''.join(c)+'\n' for c in keyiter]
会使用字符串的join
方法将迭代生成的 tuple 中的字符练成字符串生成长度为 上述的i
长度的密码。 -
for 循环是为了生成位数在 minlength ~ maxlength 之间左右可能的组合的密码。
保存密码列表
生成了密码列表还需要保存的,所以封装一个保存密码列表的函数:
def save_keys_dict(keyslist, outfile):
"""保存密码字典
Args:
keyslist: 密码列表
outfile: 要保存的密码字典文件
"""
if outfile is None:
homepath = os.path.expanduser('~')
outfile = os.path.join(homepath, 'Desktop/keys.txt')
else:
outfile = os.path.abspath(outfile)
with open(outfile, 'w') as f:
for keys in keyslist:
f.writelines(keys)
print(f'[+] 已保存密码字典到 {outfile} [+]')
这个没什么好说的,就是使用 with
语法实现安全的文件写入操作,将密码列表写入到指定文件中,为了防止指定文件为空,这里会使用 ~/Desktop/keys.txt
。
获取命令参数
使用 argparse
库解析命令参数,这里将相关操作封装到函数 getargs
中,最终返回参数信息:
def getargs():
"""获取命令参数
"""
parser = argparse.ArgumentParser(description='用于生成指定长度和字符空间的密码字典')
parser.add_argument('minlength', type=int, help='用于指定生成密码的最小位数')
parser.add_argument('maxlength', type=int, help='用于指定生成密码的最大位数')
parser.add_argument('-o', '--outfile', help='指定字典文件的保存路径')
parser.add_argument('-c', '--choices', default='0123456789', help='指定字符串,密码中的字符从字符串中选择,默认为 "0123456789"')
return parser.parse_args()
命令参数设计详情如下表:
参数 | 类型 | 描述 |
---|---|---|
minlength | int | 用于指定生成密码的最小位数 |
maxlength | int | 用于指定生成密码的最大位数 |
-o, –outfile | 文件路径 | 指定字典文件的保存路径 |
-c, –choices | 字符串 | 指定字符串,密码中的字符从字符串中选择,默认为 “0123456789” |
main实现
最终整合一下,实现 main:
if __name__ == '__main__':
args = getargs()
if args.minlength < args.maxlength:
keyslist = getkeyslist(args.minlength, args.maxlength, args.choices)
else:
keyslist = getkeyslist(args.maxlength, args.minlength, args.choices)
save_keys_dict(keyslist, args.outfile)
其中, if
是为了防止 minlength
比 minlength
大的情况。
完整代码参考:tools-with-script/keykey/keykey
使用
获取工具帮助信息
$ ./keykey -h
usage: keykey [-h] [-o OUTFILE] [-c CHOICES] minlength maxlength
用于生成指定长度和字符空间的密码字典
positional arguments:
minlength 用于指定生成密码的最小位数
maxlength 用于指定生成密码的最大位数
optional arguments:
-h, --help show this help message and exit
-o OUTFILE, --outfile OUTFILE
指定字典文件的保存路径
-c CHOICES, --choices CHOICES
指定字符串,密码中的字符从字符串中选择,默认为 "0123456789"
生成 4~6 位数字密码
$ ./keykey 4 6
[+] 已生成 4 ~ 6 位密码字典 [+]
[+] 已保存密码字典到 /Users/5km/Desktop/keys.txt [+]
$ head -n 5 /Users/5km/Desktop/keys.txt
0000
0001
0002
0003
0004
指定密码字典保存文件
$ ./keykey 4 6 -o keys.txt
[+] 已生成 4 ~ 6 位密码字典 [+]
[+] 已保存密码字典到 /Users/5km/Documents/workspace/python/tools-with-script/keykey/keys.txt [+]
$ head -n 5 keys.txt
0000
0001
0002
0003
0004
指定密码可选择字符
$ ./keykey 4 6 -o keys.txt -c 'asdfghjkl'
[+] 已生成 4 ~ 6 位密码字典 [+]
[+] 已保存密码字典到 /Users/5km/Documents/workspace/python/tools-with-script/keykey/keys.txt [+]
$ head -n 5 keys.txt
aaaa
aaas
aaad
aaaf
aaag
总结
一切顺利的话,到目前就实现了一个简单的密码字典生成器。本文复习了 itertools
和 argparse
的知识和部分使用方法,希望对您有所帮助!感谢您的阅读!