目录
第1关 随机生成一个n位密码
第2关 将随机生成的n位密码MD5加密
第3关 生成黑客密码字典
第4关 模拟碰撞破解MD5密码
第5关 检查密码是否泄漏
第1关 随机生成一个n位密码
本关任务:编写一个能随机生成一个n位密码的小程序。
1pass01.txt 1pass02.txt 1pass03.txt
Linux密码中支持的特殊字符有:" ~ @#^*%/.+:;=";windows密码中支持的特殊字符有:" ~ @/+:"; 本关要求从“十进制数字+小写大写字母+windows密码中支持的特殊字符”中随机取m个不重复的字符拼接为一个表示字符串做为密码,m是用户输入的整数,同时也用整数m做随机数的种子。
import string
import random
def generate_password(n: int) -> str:
"""接受一下整数,产生一个n位的密码,返回字符串
windows密码中支持的特殊字符有:"~@_/+:"
Linux密码中支持的特殊字符有:"~@#_^*%/.+:;="
"""
# 补充你的代码
content = string.digits + string.ascii_letters +"~ @/+:" #4SZ1qXQv h 4SZ1qtQv/h
result = ''.join(random.sample(content, n))
return result
if __name__ == '__main__':
m = int(input())
random.seed(m)
print(generate_password(m))
第2关 将随机生成的n位密码MD5加密
本关任务:编写一个将随机生成的n位密码MD5加密的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.hashlib包 2.hashlib.md5()
import string
import random
import hashlib
def generate_password(n: int) -> str:
"""接受一下整数,产生一个n位的密码,返回字符串
windows密码中支持的特殊字符有:"~@_/+:"
Linux密码中支持的特殊字符有:"~@#_^*%/.+:;="
"""
# 补充你的代码
content = string.digits + string.ascii_letters +"~ @/+:" #4SZ1qXQv h 4SZ1qtQv/h
result = ''.join(random.sample(content, n))
return result
def make_md5(password: str) -> str:
"""接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
# 补充你的代码
pass_byte = bytes(password, 'utf-8')
pass_md5 = hashlib.md5(pass_byte).hexdigest()
return pass_md5
if __name__ == '__main__':
m = int(input())
random.seed(m)
password_str = generate_password(m)
password_str_md5 = make_md5(password_str)
# 补充你的代码,输出预期结果
print(f'产生的密码是:{password_str},MD5加密结果为{password_str_md5}')
第3关 生成黑客密码字典
本关任务:编写一个能生成黑客密码字典的小程序。
import string
import hashlib
def generate_password(n: int) -> str:
"""接受一下整数,产生一个n位的密码,返回字符串
windows密码中支持的特殊字符有:"~@_/+:"
Linux密码中支持的特殊字符有:"~@#_^*%/.+:;="
"""
# 补充你的代码
content = string.digits + string.ascii_letters +"~ @/+:" #4SZ1qXQv h 4SZ1qtQv/h
result = ''.join(random.sample(content, n))
return result
def make_md5(password: str) -> str:
"""接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
# 补充你的代码
pass_byte = bytes(password, 'utf-8')
pass_md5 = hashlib.md5(pass_byte).hexdigest()
return pass_md5
def generate_pass_dic(file: str) -> dict:
"""接收文件名,以其md5加密结果为键、用文件中的密码为值构建字典,返回字典"""
# 补充你的代码
dic = {}
with open(file) as f:
content = f.readlines()
for x in content: # 遍历文件对象
x = x.strip()
y = make_md5(x)
dic.update({x: y})
return dic
def output(pass_dic: dict, n: int) -> None:
"""接收密码字典和整数n,按加入顺序输出前n项,无返回值"""
# 补充你的代码
dic1 = list(pass_dic.items())
#print(dic1)
for i in range(n):
print(f'密文{dic1[i][1]}对应明文密码为{dic1[i][0]}')
if __name__ == '__main__':
m = int(input())
filename = '/data/bigfiles/1pass00.txt'
password_dic_md5 = generate_pass_dic(filename)
output(password_dic_md5, m)
第4关 模拟碰撞破解MD5密码
本关任务:编写一个能生成黑客密码字典的小程序。
因为MD5密码不可逆,不可通过程序解密明文,所以遇到MD5加密的密码时,可行的方法将其MD5加密后的密码与黑客字典中的密文比对,若相同,则字典中的密文对应的字符串就是密码明文。
import hashlib
def make_md5(password: str) -> str:
"""接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
# 补充你的代码
pass_byte = bytes(password, 'utf-8')
pass_md5 = hashlib.md5(pass_byte).hexdigest()
return pass_md5
def generate_pass_dic(file: str) -> dict:
"""接收文件名,以其md5加密结果为键、用文件中的密码为值构建字典,返回字典"""
# 补充你的代码
dic = {}
with open(file) as f:
content = f.readlines()
for x in content: # 遍历文件对象
x = x.strip()
y = make_md5(x)
dic.update({x: y})
return dic
def crack_password(pass_dic: dict, pass_str: str) -> str:
"""接收密码字典和整数n,按加入顺序输出前n项,无返回值"""
# 补充你的代码
dic1 = list(pass_dic.items())
for i in dic1:
if pass_str ==i[1]:
return i[0]
if __name__ == '__main__':
password_str = input()
filename = '/data/bigfiles/1pass00.txt'
password_dic_md5 = generate_pass_dic(filename)
password = crack_password(password_dic_md5, password_str)
if password:
print(f'密文{password_str}的明文是{password}')
else:
print(f'密文{password_str}的明文未能破解')
第5关 检查密码是否泄漏
本关任务:编写一个能检查密码是否泄漏的小程序。文章来源:https://www.toymoban.com/news/detail-429586.html
本关要求根据文件“1pass00.txt”“1pass01.txt”“1pass02.txt”“1pass03.txt”是泄漏在网络上的用户密码明文,生成一个黑客字典。将文件中的密码明文用MD5加密,用密文做键,明文为值构建字典。用户输入一个明文密码字符串,检查黑客字典中是否存在以确定密码是否被泄漏。文章来源地址https://www.toymoban.com/news/detail-429586.html
import hashlib
def make_md5(password: str) -> str:
"""接收一个字符串,用md5加密后转为16进制,返回加密后的字符串"""
# 补充你的代码
pass_byte = bytes(password, 'utf-8')
pass_md5 = hashlib.md5(pass_byte).hexdigest()
return pass_md5
def generate_pass_dic(file: str) -> dict:
"""接收文件名,以其md5加密结果为键、用文件中的密码为值构建字典,返回字典"""
# 补充你的代码
dic = {}
with open(file) as f:
content = f.readlines()
for x in content: # 遍历文件对象
x = x.strip()
y = make_md5(x)
dic.update({x: y})
return dic
def read_txt() -> dict:
"""无参数,读取多个文件,将其中的密码用md5加密后存于字典"""
path = '/data/bigfiles/'
file_ls = ['1pass00.txt', '1pass01.txt', '1pass02.txt', '1pass03.txt']
# 补充你的代码
for i in file_ls:
position = path + "/"+ i
return generate_pass_dic(position)
def check_pass(leaked_pass_dic:dict, pass_str_md5: str):
"""检查用户的密码是否在泄漏密码库中存在,存在时返回明文,不存在时返回None"""
# 补充你的代码
#print(leaked_pass_dic)
for i in leaked_pass_dic:
if password_str == i:
return password_str
return False
if __name__ == '__main__':
password_str = input()
password_str_md5 = make_md5(password_str)
leaked_pass_dict = read_txt()
result = check_pass(leaked_pass_dict, password_str_md5)
if result:
print(f'你的密码是{result},你的密码在泄漏密码字典中')
else:
print('你的密码安全')
到了这里,关于7.6 密码设置与安全性分析(project)(安全意识)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!