1. 场景
在我们开发过程中,会产生各个系统的账号密码,那么多账号密码人工记肯定记不住,这个时候就需要创建一个文档记录这次系统地址、账号、密码。但是最近公司要求此类文档必须加密压缩,不能是弱密码。然后由于一段时间没有使用,设置的密码相对还比较复杂,直接忘记了。只记得大概使用了那些字符或者单词以及数字,然后我又想起之前我写过一篇6位数数字密码的压缩包破解,【Python实战】---- 30行代码破解加密压缩包,此处不久有了用武之地!
2. 环境
- 命令解压工具 7-zip;7-zip下载
- python 自带的执行命令模块 subprocess;
3. 安装 7-zip 配置环境变量
- 安装 7-zip,找到 7-zip 的应用程序路径;
- 此电脑 --> 右键 --> 属性;
- 高级系统设置 --> 环境变量;
- 系统变量中找到path --> 选择path --> 编辑;
- 新建 --> 将第一步的安装路径拷贝进去 --> 确定。
3.1 安装 7-zip 路径
3.2 配置环境变量
-
第一步
-
第二步
-
第三步
-
第四步
-
第五步
-
第六步
4. 验证密码
- 编写校验命令,通过需要解密的压缩包文件 xxxx.zip;
- 使用 subprocess.call(cmd) 执行命令,返回校验状态。
def verify_password(pwd):
print(f'验证的密码是:{pwd}')
cmd = f'7z t -p{pwd} ./xxxx.zip'
status = subprocess.call(cmd)
return status
5. 验证通过解密压缩包
- 输出正确的密码;
- 编写解密压缩包命令,解密 xxxx.zip 压缩包,将解密后的文件放在 output/ 文件夹下;
- 使用 subprocess.call(cmd) 执行命令,进行解密。
def unzip_file_other_folder(pwd):
print(f'正确的密码是:{pwd}')
cmd = f'7z x -p{pwd} ./xxxx.zip -y -aos -o"./output/"'
subprocess.call(cmd)
6. 组装校验密码
- 由于我还记得组成密码的主体部分,就是特殊字符、单词、数字;
- 但是不清楚特殊字符是放在开头还是结尾,因此在特殊字符列表中添加了''字符串;
- 单词和数字的顺序也不清楚,因此中间部分放入一个列表;
- 循环列表组装密码;
- 使用 verify_password 校验密码,如果校验通过;
- 使用 unzip_file_other_folder 密码解压压缩包,并结束循环。
def get_all_possible_password():
pwd_prev = ['@','!','#','','$','&','*']
pwd_center = ['stone', 'Stone', '845619', '18684996656']
for i in pwd_prev:
for j in pwd_center:
for l in pwd_center:
for m in pwd_prev:
pwd = i + j + l + m
status = verify_password(pwd)
if status == 0:
unzip_file_other_folder(pwd)
return
7. 完整代码
import time
import subprocess
def get_current_time_stamp():
times = time.time()
time_stamp = int(round(times * 1000))
return time_stamp
def verify_password(pwd):
print(f'验证的密码是:{pwd}')
cmd = f'7z t -p{pwd} ./xxxx.zip'
status = subprocess.call(cmd)
return status
def unzip_file_other_folder(pwd):
print(f'正确的密码是:{pwd}')
cmd = f'7z x -p{pwd} ./xxxx.zip -y -aos -o"./output/"'
subprocess.call(cmd)
def get_all_possible_password():
pwd_prev = ['@','!','#','','$','&','*']
pwd_center = ['stone', 'Stone', '845619', '18684996656']
for i in pwd_prev:
for j in pwd_center:
for l in pwd_center:
for m in pwd_prev:
pwd = i + j + l + m
status = verify_password(pwd)
if status == 0:
unzip_file_other_folder(pwd)
return
if __name__ == "__main__":
start = get_current_time_stamp()
get_all_possible_password()
end = get_current_time_stamp()
print(f"解压压缩包用时:{end - start}ms")
8. 总结
- 此方法也可以实现完全不知道密码的情况,就是将所有的字母和特殊符号、数字全部依次进行组装校验;
- 只是这样会需要更多的时间校验,在我们完全忘记密码时,就可以使用此方法实现,希望没有那一天;
- 由于之前实现了一个类似需求,所以此次实现就是在原来的基础上进行了档次代码的修改和优化,根据每次不同需求,完成开发。